POJ 2406 Power Strings (求字符串循环节出现的次数)
Power Strings
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 44217 | Accepted: 18449 |
Description
Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "abcdef". If we think of concatenation as multiplication, exponentiation by a non-negative integer is defined in the normal way: a^0 = "" (the empty string) and a^(n+1) = a*(a^n).
Input
Each test case is a line of input representing s, a string of printable characters. The length of s will be at least 1 and will not exceed 1 million characters. A line containing a period follows the last test case.
Output
For each s you should print the largest n such that s = a^n for some string a.
Sample Input
abcd aaaa ababab .
Sample Output
1 4 3
/* * POJ 2406 Power Strings * 求字符串循环节出现的次数 * * 结论:字符串S有最小循环节(p<len)的充要条件是(len-next[len])|len,next[len]>0 * 其中p是循环节长度,len是字符串S的长度 */ #include <stdio.h> #include <string.h> #include <iostream> using namespace std; const int MAXN = 1000000+10; void Get_Next(char* P,int* next) { int i=0,k=-1; int plen=strlen(P); next[0]=-1; while(i<plen) { if(k==-1||P[k]==P[i]) { i++,k++; next[i]=k; } else k=next[k]; } } char str[MAXN]; int nxt[MAXN]; int main() { while(scanf("%s",str)==1) { if(str[0]=='.') break; Get_Next(str,nxt); int n=strlen(str); int k=n-nxt[n]; if(n%k==0&&n/k>1) printf("%d\n",n/k); else printf("1\n"); } return 0; }