Time Limit: 3000MS | Memory Limit: 30000K | |
Total Submissions: 15428 | Accepted: 7397 |
Description
Input
Output
Sample Input
3 aaa 12 aabaabaabaab 0
Sample Output
Test case #1 2 2 3 3 Test case #2 2 2 6 2 9 3 12 4
计算字符串的前缀中的最小循环节,要求输出 前缀长度 和 最小循环节循环次数(>=2)
AC代码:
#include<cstdio> #include<cstring> #include<cmath> #include<queue> #define mem(a, b) memset(a, (b), sizeof(a)) #define Wi(a) while(a--) #define Si(a) scanf("%d", &a) #define Sch(a) scanf("%s", a) #define Pi(a) printf("%d\n", (a)) #define INF 0x3f3f3f3f #define mod 10007 #define LL longlong #include<algorithm> using namespace std; const int N = 1000000+10; char s[N]; int p[N]; int ls; int num[N]; void getp() { int i = 0, j = -1; p[i] = j; while(i < ls) { if(j==-1||s[i]==s[j]) { i++, j++; p[i] = j; } else j = p[j]; } } int main() { int t = 1, n; while(Si(n), n) { Sch(s); ls = n; getp(); printf("Test case #%d\n", t++); for(int i = 1; i <= n; i++) { int j = i; if(p[j]==0) continue; if(j % (j - p[j])==0) printf("%d %d\n", i, j/(j-p[j])); } printf("\n"); } return 0; }