题目请点我
题解:
这道题是KMP的变形,关键是找到重复单元的长度。设置一个辅助数组,用于存储长度为i的串的重复单元长度,对于任意长度的串初始化重复单元长度为自身,当满足关系式能够更新时再去更新。
代码实现:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define MAX 1000010
using namespace std;
int N;
int len;
int flag;
int pos,K;
char s[MAX];
int Next[MAX];
int Last[MAX];
void getnext();
int main()
{
flag = 1;
while( scanf("%d",&N) && N ){
getchar();
gets(s);
len = strlen(s);
getnext();
memset(Last,0,sizeof(Last));
Last[1] = 1;
printf("Test case #%d\n",flag++);
for( int i = 1; i <= len; i++ ){
Last[i] = i;
int tmp = Next[i];
//等差
if( Last[tmp] == i-tmp ){
Last[i] = Last[tmp];
printf("%d %d\n",i,i/Last[i]);
}
}
printf("\n");
}
return 0;
}
void getnext(){
memset(Next,0,sizeof(Next));
Next[0] = -1;
int i = 0,j = -1;
while( i < len ){
if( j == -1 || s[i] == s[j] ){
Next[++i] = ++j;
}
else{
j = Next[j];
}
}
return ;
}