长度为m[1,2...m]的模式的循环节为 m-next[m] ,
aaa 循环节clc为1 (clc=m-next[m]= 3-2 =1) 此时 m%clc == 0 表示有3个完整的循环节
ababa 循环节为2 (clc = 5-3=2) 此时 m%clc = 5%2 =1 表示有两个循环节 还余一个数 ,需添加的字符数 为 len - m%clc
abaed 循环节为 5 (clc = 5-0=5) 此时, clc = m 表示只有一个完整的循环节 ,如果至少要两个循环节的话 ,需添加的字符数 为 len
下表从1 开始的代码如下:
#include<iostream> #include<stdio.h> #include<string> #include<string.h> #define N 100005 using namespace std; char P[N]; int m; int next[N]; void Prefix_Func() { int i,k; k=0; next[1]=0; for(i=2;i<=m;i++) { while(k>0 && P[k+1]!= P[i]) k=next[k]; if(P[k+1] == P[i]) k++; next[i]=k; } } int main() { int t,clc; cin>>t; while(t--) { scanf("%s",P+1); m=strlen(P+1); Prefix_Func(); clc=m-next[m]; if(clc==m) cout<<m<<endl; else if(m%clc== 0) cout<<"0"<<endl; else { cout<<clc-m%clc<<endl; } } return 0 ; }