题意:输入一个字符串S,求的每一个前缀可否由某个更小的前缀重复构成。比如aabaabaabaab,前2位是aa,a重复了2次,前6位是aabaab,aab重复了2次,前9位是aabaabaab,aab重复了3次,前12位是aabaabaabaab,aab重复了4次。
题解:算是 next 函数的一种应用吧,记住了。
#include <iostream>
using namespace std;
#define N 1000005
char str[N];
int next[N], n;
void get_next ()
{
int i = 0,j = -1;
next[0] = -1;
while ( i < n )
{
if ( j == -1 || str[i] == str[j] )
{
++i; ++j; next[i] = j;
}
else j = next[j];
}
}
int main ()
{
int t = 0;
while ( scanf("%d",&n) && n )
{
scanf("%s",str);
printf("Test case #%d\n",++t);
get_next();
for ( int 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] ) );
putchar('\n');
}
return 0;
}