1. 程式人生 > >A. Many Equal Substrings(思維)

A. Many Equal Substrings(思維)

傳送門

  寫這題順便學了下string類裡substr的用法substr有2個引數,第一個引數為你需要擷取的子串的起始位置的索引(下標),第二個引數為從起始位置開始擷取的長度。

  這題就用到了substr函式,這題首先要分2種情況,一種是t串裡不含相同的字首字尾時,s串裡有多少個t串,就輸出多少次t串就可以了,這樣可以保證是最短的,第二種就是有相同字首字尾,那就把最大的相同字首字尾的長度求出來,每次輸出t串時就不必整個t串都輸出了,因為t串具有相同字首字尾這個性質,前面一個輸出的t串的字尾就可以作為當前輸出的t串的字首,這樣子就可以保證是最短的。

#include<bits/stdc++.h>
using namespace std;
string s;
int n,ti,nxt[55];
int main()
{
    scanf("%d %d",&n,&ti);
    cin>>s;
    nxt[0]=0;
    for(int i=1,k=0;i<n;i++)
    {
        while(k>0&&s[i]!=s[k])
            k=nxt[k-1];
        if(s[i]==s[k])
            k++;
        nxt[i]=k;
    }
    if(nxt[n-1]==0)
    {
        while(ti--)
            cout<<s;
        cout<<endl;
        return 0;
    }
    string p=s.substr(nxt[n-1],n-nxt[n-1]);
    cout<<s;
    for(int i=2;i<=ti;i++)
    {
        cout<<p;
    }
    cout<<endl;
    return 0;
}