擴展KMP(Z algorithm)

重新記錄一個板子

  1. 字符串下標從00開始(也可以很容易得改成從11開始)
  2. ZZ數組的Z[0]Z[0]不是良定義的,默認爲00;如果有必要,可以在getZ()getZ()的最後進行Z[0]=nZ[0]=n的修改
  3. S[j,j+z[j]1]S[j,j+z[j]-1]表示右端點最靠右的已匹配串
  4. ZZ數組的關鍵在於儘可能利用已求出的ZZ數組值
char s[maxn];
int z[maxn];

void getZ() {
    int n=strlen(s);
    for(int i=1, j=0; i<n; ++i) {
        if(i<j+z[j]) z[i]=min(j+z[j]-i,z[i-j]);
        while(i+z[i]<n&&s[z[i]]==s[i+z[i]]) z[i]++;
        if(i+z[i]>j+z[j]) j=i;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章