用KMP求循环节。
/*Accepted 5288K 110MS G++ 712B 2012-08-01 16:03:19*/ #include<stdio.h> #include<string.h> #include<stdlib.h> const int MAXN = 1 << 20; char t[MAXN]; int next[MAXN], len; void Make_Next() { int i = 0, j = -1; next[0] = -1; len = strlen(t); while(i < len) { if(-1 == j || t[i] == t[j]) { ++ i, ++ j; if(t[i] != t[j]) next[i] = j; else next[i] = next[j]; } else j = next[j]; } } int cal() { if(len % (len - next[len]) == 0) return len / (len - next[len]); return 1; } int main() { while(scanf("%s", t) && t[0] != '.') { Make_Next(); printf("%d\n", cal()); } return 0; }