A. Many Equal Substrings(思维)

版权声明:菜鸡博客大佬随便转 https://blog.csdn.net/qq_40642465/article/details/82769907

传送门

  写这题顺便学了下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;
}

猜你喜欢

转载自blog.csdn.net/qq_40642465/article/details/82769907