链接: https://vjudge.net/problem/FZU-1901 题意: For each prefix with length P of a given string S,if S[i]=S[i+P] for i in [0..SIZE(S)-p-1], then the prefix is a “period” of S. We want to all the periodic prefixs. 思路: 求可能的循
链接:
https://vjudge.net/problem/FZU-1901
题意:
For each prefix with length P of a given string S,if
S[i]=S[i+P] for i in [0..SIZE(S)-p-1],
then the prefix is a “period” of S. We want to all the periodic prefixs.
思路:
求可能的循环节长度.
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <vector> //#include <memory.h> #include <queue> #include <set> #include <map> #include <algorithm> #include <math.h> #include <stack> #include <string> #include <assert.h> #include <iomanip> #include <iostream> #include <sstream> #define MINF 0x3f3f3f3f using namespace std; typedef long long LL; const int MAXN = 1e6+10; const int MOD = 1e4+7; char a[MAXN]; int Next[MAXN], Res[MAXN]; int n; void GetNext(char *s) { int len = strlen(s); int j = 0, k = -1; Next[0] = -1; while (j < len) { if (k == -1 || s[j] == s[k]) { ++j; ++k; Next[j] = k; } else k = Next[k]; } } int main() { int t, cnt = 0; scanf("%d", &t); while (t--) { scanf("%s", a); int len = strlen(a); GetNext(a); int ans = 0; int p = len; while (p > 0) { Res[++ans] = len-Next[p]; p = Next[p]; } printf("Case #%d: %d\n", ++cnt, ans); printf("%d", Res[1]); for (int i = 2;i <= ans;i++) printf(" %d", Res[i]); puts(""); } return 0; }