KMP中next数组的应用
Posted lh2000
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KMP中next数组的应用相关的知识,希望对你有一定的参考价值。
KMP算法中,求了一个前缀函数: 为前 个字符组成的子串中、真前缀、真后缀相等的最大长度。
例如对于abcabcd
a
,,没有真前后缀。ab
,abc
,abca
,abcab
,abcabc
,abcabcd
,
那么对于给出的字符串求 数组后,前后缀相等的最大长度即为 。
并且只要途中出现过 ,就说明途中出现了一次与前后缀相同的字符串。
除此之外的一个坑点: 可能大于所有 ,因此出现此种情况时缩短所取前后缀的长度: ,直到存在 。
如果缩短后 ,说明无解。
#include<bits/stdc++.h> using namespace std; const int MAXN=200005; int Next[MAXN]; char str[MAXN],vis[MAXN],strf[MAXN]; int cnt; int getFail(char *p,int plen){ Next[0]=0,Next[1]=0; for(int i=1;i<plen;i++){ int j=Next[i]; while(j&&p[i]!=p[j]) j=Next[j]; Next[i+1]=(p[i]==p[j])?j+1:0; } return 0; } int main(){ scanf("%s",str); int n=strlen(str); getFail(str,strlen(str)); for(int i=1;i<strlen(str);i++)vis[Next[i]]=1; int temp=Next[n]; while(temp){ if(vis[temp]){ for(int i=0;i<temp;i++){ cout<<str[i]; } return 0; } else{ temp=Next[temp]; } } return 0; }
以上是关于KMP中next数组的应用的主要内容,如果未能解决你的问题,请参考以下文章
poj2406(求字符串的周期,kmp算法next数组的应用)