链接:
https://vjudge.net/problem/HDU-1358#author=0
题意:
For each prefix of a given string S with N characters (each character has an ASCII code between 97 and 126, inclusive), we want to know whether the prefix is a periodic string. That is, for each i (2 <= i <= N) we want to know the largest K > 1 (if there is one) such that the prefix of S with length i can be written as A K , that is A concatenated K times, for some string A. Of course, we also want to know the period K.
思路:
先求出Next数组, 然后遍历一遍, 求出每个前缀的循环节, 再判断是否满足即可.
代码:
#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; int Next[MAXN]; char s[MAXN], p[MAXN]; void GetNext() { int len = strlen(p); Next[0] = -1; int j = 0; int k = -1; while (j < len) { if (k == -1 || p[k] == p[j]) { ++k; ++j; Next[j] = k; } else k = Next[k]; } } int main() { int cnt = 0, n; while (~scanf("%d", &n) && n) { scanf("%s", p); GetNext(); printf("Test case #%d\n", ++cnt); for (int i = 2;i <= n;i++) { int len = i-Next[i]; if (len != i && i%len == 0) printf("%d %d\n", i, i/len); } puts(""); } return 0; }