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 }