题目描述
你有一个字符串t,它由n个字母组成。
定义一个字符串s的子串为s[l...r],表示从位置l到r构成的一个新的串。
你的目标是构造一个字符串s,使得它的可能长度最小,要求s中存在k个位置i,可以找到k个以i为出发点的子串t。
输入:
第一行输入两个整数n和k,表示t的长度和需要k个子串第二行输入字符串t
输出:
输出满足条件的长度最小的s。题目保证答案唯一。
kmp模板题,只要初始化一下,输出就完了。
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<algorithm> 5 #include<cstring> 6 using namespace std; 7 const int maxn = 50 + 2; 8 char B[maxn]; 9 int p[maxn]; 10 int main() 11 { 12 int n,k; 13 cin>>n>>k; 14 scanf("%s",B+1); 15 p[1]=0; 16 int j=0; 17 for(int i=1;i<n;i++) 18 { 19 while(B[i+1]!=B[j+1] && j) j=p[j]; 20 if(B[i+1]==B[j+1]) j++; 21 p[i+1]=j; 22 } 23 printf("%s",B+1); 24 for(int i=1;i<k;i++) 25 for(int j=p[n]+1;j<=n;j++) printf("%c",B[j]); 26 return 0; 27 }