/*#include"stdio.h"
int main()
{
int number,times = 0, i,cishu,top,j;
char s[1000000];
while(scanf("%d",&number) && number != 0)
{
scanf("%s" ,s);
printf("Test case #%d/n",++times);
for(i = 1 ; i < number; i++)
{
cishu = 2;
top = i;
j = 0;
while(top < number)
{
if(s[j] != s[top])
break;
j++;
top++;
if(top== j * cishu )
{
printf("%d %d/n",top,cishu++);
j = 0;
i = top;
}
}
}
}
return 0;
}*///上面是我自己写的算法,虽然很有成就感,但是,效率只有O(n^2),
/下面是高人写的算法,效率是O(n)! 厉害,我还得多多努力!
{
int number,times = 0, i,cishu,top,j;
char s[1000000];
while(scanf("%d",&number) && number != 0)
{
scanf("%s" ,s);
printf("Test case #%d/n",++times);
for(i = 1 ; i < number; i++)
{
cishu = 2;
top = i;
j = 0;
while(top < number)
{
if(s[j] != s[top])
break;
j++;
top++;
if(top== j * cishu )
{
printf("%d %d/n",top,cishu++);
j = 0;
i = top;
}
}
}
}
return 0;
}*///上面是我自己写的算法,虽然很有成就感,但是,效率只有O(n^2),
/下面是高人写的算法,效率是O(n)! 厉害,我还得多多努力!
#include <stdio.h>
#define MAX 1000000
int f[MAX+1], l[MAX+1];
char s[MAX+1];
void solve(int n)
{
int k,q;
f[1] = 0;
k = 0;
l[1] = 1;
for(q = 2; q <= n; q++)
{
while(k && s[k] != s[q-1])
k = f[k];
if(s[k] == s[q-1])
k++;
f[q] = k;
if(q-k == l[k])
{
#define MAX 1000000
int f[MAX+1], l[MAX+1];
char s[MAX+1];
void solve(int n)
{
int k,q;
f[1] = 0;
k = 0;
l[1] = 1;
for(q = 2; q <= n; q++)
{
while(k && s[k] != s[q-1])
k = f[k];
if(s[k] == s[q-1])
k++;
f[q] = k;
if(q-k == l[k])
{
printf("%d %d/n", q, q/l[k]);
l[q] = l[k];
}
else
l[q] = q;
}
}
l[q] = l[k];
}
else
l[q] = q;
}
}
int main()
{
int n, cas = 1;
while(scanf("%d", &n)&& n!=0)
{
scanf("%s", s);
printf("Test case #%d/n", cas++);
solve(n);
putchar('/n');
}
return 0;
}
{
int n, cas = 1;
while(scanf("%d", &n)&& n!=0)
{
scanf("%s", s);
printf("Test case #%d/n", cas++);
solve(n);
putchar('/n');
}
return 0;
}