这两道题目是类似的。
是用next 数组来做的。
不同的是1961 是求第i位置的最小循环节的 循环次数。
aabaabaabaab,长度为12.到第二个a时,a出现2次,输出2.到第二个b时,aab出现了2次,输出2.到第三个b时,aab出现3次,输出3.到第四个b时,aab出现4次,输出4.
2406 是求最后位置的最小循环节的 循环次数
2406
#include <stdio.h>
#include <string.h>
#define N 1000005
#define max(a,b) (a>b?a:b)
int next[N];
char s[N];
void get_next(int len)
{
int i,j=0;
next[1]=0;
for(i=2;i<=len;i++)
{
while(j>0&&s[j+1]!=s[i])
j=next[j];
if(s[j+1]==s[i])
j++;
next[i]=j;
}
}
int main()
{
int i,j;
while(scanf("%s",s+1)!=EOF)
{
if(s[1]=='.')
break;
int len=strlen(s+1);
get_next(len);
j=len-next[len];
if(len%j==0)
printf("%d\n",len/j);
else
printf("1\n");
}
}
1906
#include<iostream>
#include<stdio.h>
#include<memory.h>
using namespace std;
char s[1000005];
int next[1000005];
void get_next(int len)
{
int i,j=0;
next[1]=0;
for(i=2;i<=len;i++)
{
while(j>0&&s[j+1]!=s[i])
j=next[j];
if(s[j+1]==s[i])
j++;
next[i]=j;
}
}
int main()
{
int i,j,n,cas=1;
while(scanf("%d",&n),n)
{
printf("Test case #%d\n",cas++);
scanf("%s",s+1);
get_next(n);
for(i=2;i<=n;i++)
{
j=i-next[i];
if(i%j==0&&i!=j)
printf("%d %d\n",i,i/j);
}
printf("\n");
}
}