题意:
考察一个字符串的从开始的子串是周期的并且计算出周期,kmp最小循环节问题。
解析:
这篇题解有对kmp循环节的证明
http://blog.youkuaiyun.com/scorpiocj/article/details/6295913
AC代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdlib>
using namespace std;
typedef long long ll;
const int N = 1000005;
char str[N];
int len;
int jump[N];
void getNext() {
int j = 0, k = -1;
jump[0] = -1;
while(j < len) {
if(k == -1 || str[j] == str[k])
jump[++j] = ++k;
else k = jump[k];
}
}
int main() {
int cas = 1;
while(scanf("%d", &len) && len) {
scanf("%s", str);
getNext();
printf("Test case #%d\n", cas++);
for(int i = 2; i <= len; i++) {
int tmp = (i - jump[i]);
if(i % tmp == 0 && i / tmp > 1) {
printf("%d %d\n", i, i / tmp);
}
}puts("");
}
return 0;
}