题目链接:https://vjudge.net/problem/HDU-3746
知识点: KMP
解题思路:
论如何用 \(Next[]\) 数组求循环节。
AC代码:
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 const int maxn = 100000+5; 5 char inp[maxn]; 6 int Next[maxn]; 7 void init(int plen){ 8 memset(Next,0,sizeof(Next)); 9 int i=0,j=-1; 10 Next[0]=-1; 11 while(i<plen){ 12 if(j==-1||inp[i]==inp[j]){ 13 i++,j++; 14 Next[i]=j; 15 } 16 else 17 j=Next[j]; 18 } 19 } 20 int main(){ 21 int T; 22 scanf("%d",&T); 23 while(T--){ 24 scanf("%s",inp); 25 int len=strlen(inp); 26 init(len); 27 int tmp=len-Next[len]; //tmp:循环节长度 28 if(tmp!=len&&len%tmp==0) printf("0\n"); 29 else printf("%d\n",tmp-Next[len]%tmp); //%tmp有效地忽略了Next[len]里面的完整的循环节 30 } 31 return 0; 32 }