这题跟POJ 2752差不多,因为要求前缀,所以要从前到后遍历求出每个满足要求的前缀。
#include <map>
#include <set>
#include <list>
#include <queue>
#include <deque>
#include <stack>
#include <string>
#include <time.h>
#include <cstdio>
#include <math.h>
#include <iomanip>
#include <cstdlib>
#include <limits.h>
#include <string.h>
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
#define LL long long
#define MIN INT_MIN
#define MAX INT_MAX
#define PI acos(-1.0)
#define FRE freopen("input.txt","r",stdin)
#define FF freopen("output.txt","w",stdout)
#define N 1000005
char str[N];
int p[N];
int main () {
int ca = 1;
int sz;
while (scanf("%d",&sz) && sz) {
scanf("%s",str+1);
int i,j = 0;
p[1] = 0;
for (i = 2; i <= sz; i++) {
while (j > 0 && str[i] != str[j+1]) {
j = p[j];
}
if (str[i] == str[j+1]) j++;
p[i] = j;
}
printf("Test case #%d\n",ca++);
for (i = 2; i <= sz; i++) {
if (p[i] == 0)continue;
if (i % (i -p[i]) == 0) {
printf("%d %d\n",i,i/(i - p[i]));
}
}
puts("");
}
return 0;
}