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