CF1029A Many Equal Substrings

题目描述

你有一个字符串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 }

猜你喜欢

转载自www.cnblogs.com/hfang/p/10732161.html