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模板题,只要初始化一下,输出就完了。

 #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 ;
}
上一篇:Sharding-JDBC(三)3.1.0版本实践


下一篇:qml: QtCharts模块的使用(基本配置)------<一>