上学期的时候已经确定这个要找公共前缀和后缀的最长长度了,近几天研究了kmp更加了解了这个东西。这道题可以让我们更清楚的了解next数组。那这题怎么做呢?
首先我们把next数组求出来,得到字符串(n这个位置,因为是整个字符串重复)的最长公共前后缀长度,然后直接输出一遍,然后我们可以直接利用公共部分,削减剩下输出的长度,具体可以看代码。
#include<cstdio>
#include<algorithm>
#include<list>
#include<cstring>
#include<iostream>
#include<bitset>
//#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];
}
}