Input
The input consists of several test cases. Each test case consists of two lines. The first one contains N (2 <= N <= 1 000 000) – the size of the string S.The second line contains the string S. The input file ends with a line, having the
number zero on it.
Output
Sample Input
3
aaa
12
aabaabaabaab
0
Sample Output
Test case #1
2 2
3 3
Test case #2
2 2
6 2
9 3
12 4
題目大意:給出一個長度為n的字元串,從長度為2的字首開始,一一判斷 字首 是否為 循環串 構成,并輸出 字首長度 和 循環串的個數 。
e.g Test case #2中 aabaabaab 是長度為9的字首,其循環串為aab,個數為3,故輸出 9 3 。
知識點:如果i,滿足i%(i-next[i])=0則長度為i的字首,是由循環串構成, 其個數為i/(i-next[i])。
Tip:但如此會出現循環串個數為1的情況,與題意不符,故排除掉。
抄襲加原創代碼(抄襲部分出處未知):
#include<stdio.h>
int next[1000005];
char a[1000005];
void getnext(char *a,int n)
{
int i,j;
i=0,j=next[0]=-1;
while(i<n)
{
if(j==-1||a[i]==a[j])
{
i++,j++;
next[i]=j;
}
else
{
j=next[j];
}
}
}
int main()
{
int n,i,t=1;
while(~scanf("%d",&n)&&n!=0)
{
scanf("%s",a);
printf("Test case #%d\n",t++);
getnext(a,n);
for(i=2;i<=n;i++)
{
if(i%(i-next[i])==0&&i/(i-next[i])>1)
{
printf("%d %d\n",i,i/(i-next[i]));
}
}
printf("\n");
}
}