next数组的应用题。
对于next[i] ,i代表长度,i-next[i]代表最开始可分割的长度,如果i%(i-next[i])为0且 i/(i-next[i])>1 则代表能分出长度为i-next[i]的i/(i-next[i]) 个部分!i
#include"cstdio"
#include"cstring"
#include"cmath"
#include"cstdlib"
#include"iostream"
#include"algorithm"
#include"queue"
using namespace std;
char a[1000002];
int next[1000002],n;
void getnext(char *t)
{
int i,j;
i=0;
j=-1;
next[0]=-1;
while(t[i])
{
if(j==-1||t[i]==t[j]) next[++i]=++j;
else j=next[j];
}
}
int main()
{
int cas=1;
while(scanf("%d",&n),n)
{
scanf("%s",a);
getnext(a);
printf("Test case #%d\n",cas++);
for(int i=0;i<=n;i++)
{
if(next[i]==0) continue;
if(i%(i-next[i])==0&&i/(i-next[i])>0)
{
printf("%d %d\n",i,i/(i-next[i]));
}
}
puts("");
}
}