1. 程式人生 > 實用技巧 >KMP中next陣列的應用

KMP中next陣列的應用

KMP演算法中,求了一個字首函式:為前個字元組成的子串中、真字首、真字尾相等的最大長度。
例如對於abcabcd

  1. a,,沒有真前後綴。
  2. ab,
  3. abc,
  4. abca,
  5. abcab,
  6. abcabc,
  7. 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; }