用到了kmp的算法;
学到了y神求next数组的模板,太强了简洁明了;
C++ 代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e6+6;
const int base = 131;
int n;
char s[maxn];
int nnext[maxn];
void get_next()
{
for(int i = 2, j = 0;i <= n; i ++)
{
while(j && s[i] != s[j+1]) j = nnext[j];
if(s[i] == s[j+1]) j ++;
nnext[i] = j;
}
}
int main()
{
int t = 1;
while(scanf("%d",&n) && n)
{
printf("Test case #%d\n",t);
t ++;
scanf(" %s",s+1);
get_next();
for(int i = 1; i <= n; i ++)
{
int t = i - nnext[i]; //如果当前位置到nnext数组上一个,也就是这个小循环
if(t != i && i%t == 0) //如果小循环不等于整个字符串,并且能除的净
printf("%d %d\n",i,i/t); //我们就输出
}
puts("");
}
return 0;
}
思考:kmp算法求得的 next数组的理解,做字符串题要多想到字符串hash与kmp 马拉车