题意 给定一个字符串A,求最短的字符串B,使得A是若干个B连接成的字符串的前缀 若A=abcabcab 则B=abc
求出A串在KMP算法中A的next数组 设A的长度为N 则答案为A的前N-next[N]位 分两种情况讨论: next[N] > N/2 next[N] <= N/2
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
char w[
1000005];
int n,len_s,len_w,ans,t[
1000005];
inline void calc_w()
{
int j;
t[
0]=-
1;
for (
int i=
0;i<n;i++)
{
j=t[i];
while(w[i]!=w[j]&j!=-
1)
j=t[j];
t[i+
1]=++j;
}
}
int main()
{
cin>>n;
scanf(
"%s",w);
calc_w();
for (
int i=
1;i<=n;i++)
cout<<t[i]<<
' ';
cout<<endl;
cout<<n-t[n];
}
转载请注明原文地址: https://ju.6miu.com/read-658941.html