T1 Power Strings    poj 2406

题目大意:

求每个字符串的最短循环节的循环次数

思路:

哈希用kmp做

直接判断一下n-nxt[n]是否是n的约数

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstdlib>
 5 #include<cstring>
 6 #include<algorithm>
 7 #include<vector>
 8 #include<queue>
 9 #define inf 2139062143
10 #define ll long long
11 #define MAXN 100100100
12 using namespace std;
13 inline int read()
14 {
15     int x=0,f=1;char ch=getchar();
16     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
17     while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
18     return x*f;
19 }
20 int n,nxt[MAXN];
21 char a[MAXN];
22 int main()
23 {
24     while(scanf("%s",a+1))
25     {
26         if(a[1]=='.') break;
27         n=strlen(a+1);
28         for(int i=1,j=0;i<n;i++)
29         {
30             while(a[i+1]!=a[j+1]&&j) j=nxt[j];
31             if(a[i+1]==a[j+1]) j++;
32             nxt[i+1]=j;
33         }
34         if(n%(n-nxt[n])==0) printf("%d\n",n/(n-nxt[n]));
35         else puts("1");
36     }
37 }
View Code

相关文章: