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;
}