Cyclic Nacklace HDU - 3746

原题链接

求后缀凑成循环串还差几个字符

KMP练习

从前面的无线传输我们已经懂了怎么利用KMP求循环串长度,这里我们从尾下标就可以判断末尾是循环串的第几个字符

但这里有多种情况,分类讨论即可

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 const int N = 100010;
 6 char a[N];
 7 int ne[N]; 
 8 int main()
 9 {
10     int t;
11     scanf("%d",&t);
12     while(t--){
13         int ans = 0;
14         scanf("%s",a+1);
15         int len = strlen(a+1);
16         for(int i=2,j=0;i<=len;i++){
17             while(j&&a[i]!=a[j+1]) j = ne[j];
18             if(a[i]==a[j+1]) j++;
19             ne[i] = j;
20         }
21         int tmp = len-ne[len];
22         if(len%tmp==0){
23             if(ne[len]==0) ans = len;
24             else ans = 0;
25         }else ans = tmp-len%tmp;
26         printf("%d\n",ans);
27     }
28     return 0;
29 }

 

posted @ 2020-12-30 23:45  acmloser  阅读(68)  评论(0编辑  收藏  举报