cf 1029 A 新生赛的题补回来了

题目

上学期的时候已经确定这个要找公共前缀和后缀的最长长度了,近几天研究了kmp更加了解了这个东西。这道题可以让我们更清楚的了解next数组。那这题怎么做呢?

首先我们把next数组求出来,得到字符串(n这个位置,因为是整个字符串重复)的最长公共前后缀长度,然后直接输出一遍,然后我们可以直接利用公共部分,削减剩下输出的长度,具体可以看代码。

#include
#include
#include
#include
#include
#include
//#define int long long
using namespace std;
int kmp[1000003],len,j,cnt,n,k;
char a[1000003];
int main()
{
     
	ios::sync_with_stdio(false);
	cin>>n>>k;
	cin>>a+1;
	len=strlen(a+1);
	for(int i=2;i<=len;i++)
	{
     
		while(j&&a[i]!=a[j+1])
		{
     
			j=kmp[j];
		}
		if(a[j+1]==a[i])
		{
     
			j++;
		}
		kmp[i]=j;
	}
	cout<<a+1;
	k--;
	for(int i=1;i<=k;i++)
	{
     
		cout<<a+1+kmp[n];
	}
 } 

你可能感兴趣的:(字符串,kmp)