题目:
题意:
给出一个字符串,求出前缀字符串中是周期串的长度和周期数(周期数大于1)。
思路:
利用KMP求出前缀表p[],看看每个前缀串的长度减去前缀表是否可以被前缀串的长度整除,即len%(len-p[len])==0?,即len-p[len]就为周期串的周期长度,len/(len-p[len])即为周期数。
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=1e6+5;
int n;
char a[maxn];
int p[maxn];
void prefix_table()
{
int i=0,j=-1;
p[0]=-1;
while (i<=n)
{
if(j==-1||a[i]==a[j])
{
p[++i]=++j;
}
else
{
j=p[j];
}
}
}
int main()
{
int num=0;
while (scanf("%d",&n)!=EOF&&n)
{
num++;
scanf("%s",a);
prefix_table();
printf("Test case #%d\n",num);
for (int i=0;i<=n;i++)
{
int t=i-p[i];
if(i%t==0&&i/t>1)
{
printf("%d %d\n",i,i/t);
}
}
printf("\n");
}
return 0;
}