kmp next的应用
题意:
给出一个字符串,这个字符串有很多前缀额和后缀,现在问有多少前缀与后缀相同,输出其长度即可。
思路:
这道题利用到了next数组的含义:Next[i] 在子串0~i-1长度为i的子串中最长的前缀与后缀相同的长度。
那么通过Next[len-1] 找到一个最长的,然后在最长的子串中接着找出次长的,以此类推。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1e6 + 10;
int Next[maxn];
char mo[maxn];
int ans[maxn],pos;
void getNext()
{
int i = 0,j = -1,l1 = strlen(mo);
Next[0] = -1;
while(i < l1) {
if(j == - 1 || mo[i] == mo[j]) Next[++i] = ++j;
else j = Next[j];
}
}
void solve()
{
pos = 0;
int len = strlen(mo);
int t = len-1;
while(t != -1) {
if(mo[Next[t]] == mo[len-1]) {
ans[pos++] = Next[t] + 1;
}
t = Next[t];
}
ans[pos] = len;
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%s",mo) != EOF) {
getNext();
solve();
//sort(ans,ans+pos+1);
for(int i = pos-1;i >= 0; i--) {
printf("%d ",ans[i]);
}
printf("%d\n",ans[pos]);
}
return 0;
}