题目链接:poj1961
题目大意:
给你一个字符串,求这个字符串到第i个字符为止的循环节的次数。
比如aabaabaabaab,长度为12.到第二个a时,a出现2次,输出2.到第二个b时,aab出现了2次,输出2.到第三个b时,aab出现3次,输出3.到第四个b时,aab出现4次,输出4.
解题思路:
这道题好像就是POJ 2406的加强版而已。那道题是输出一个字符串的循环节出现的次数,这个是到第i个字符为止,其实就是多了一层循环。把这个字符串遍历一次即可。
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
using namespace std;
#define maxn 2000100
char s[maxn];
int nexts[maxn];
int n,m;
void getnexts()
{
int j=0;
int k=-1;
nexts[0]=-1;
while(j<m)
{
if(k==-1||s[j]==s[k])
{
j++;k++;
nexts[j]=k;
}
else k=nexts[k];
}
}
int main()
{
int cas=1;
while(~scanf("%d",&m)&&m)
{
scanf("%s",s);
getnexts();
printf("Test case #%d\n",cas++);
for(int i=2;i<=m;i++)
{
if(i!=(i-nexts[i])&&i%(i-nexts[i])==0)
printf("%d %d\n",i,i/(i-nexts[i]));
}
printf("\n");
}
return 0;
}