HDU3746 Cyclic Nacklace

题目链接: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 }

 

posted @ 2018-02-12 23:46  Blogggggg  阅读(105)  评论(0编辑  收藏  举报