一、题目:period
二、题意:http://acm.pku.edu.cn/JudgeOnline/problem?id=1961
三、解决办法:
赤裸裸的kmp算法
四、源代码:
#include "stdio.h"
#include "string.h"
#define MAX 1000010
char s[MAX];
int next[MAX];
void get_next()
{
int i, j;
int N = strlen(s);
i = 0;
next[0] = -1;
j = -1;
while (i < N)
{
if (j == -1 || s[i] == s[j])
{
i++;
j++;
next[i] = j;
}
else
{
j = next[j];
}
}
}
int main()
{
freopen("1.txt", "r", stdin);
int i, j; //辅助值
int k = 1; //程序运行的次数
int N; //数组的长度
int p = 0;
while (scanf("%d", &N) && N != 0)
{
getchar();
gets(s);
printf("Test case #%d/n", k);
get_next();
for (i = 2; i <= N; i++)
{
j = i - next[i];
if (i % j == 0 && i / j > 1)
{
printf("%d %d/n", i, i / j);
}
}
k++;
printf("/n");
}
return 0;
}