模板 kmp字串匹配

2021-08-17 10:34:01 字數 1230 閱讀 8786

題目:kmp字串匹配

資料:syc大佬的部落格

思路:nxt[i] :字串0~i的最長相等的字首字尾長減1,也就是最長相等字首字尾中的字首的結束位置。

比如從i開始查詢到j處時不匹配,nxt[j]=2,也就是說a段和b段完全相等,因為a是x串的字首,那麼b也是x串的字首,可以直接從b段開始匹配:

i                     j

xx xx xx xx xx xx

yy yy yy  yy yy

|   a   |       |  b   |

update in 2018/10/26 :

天哪我竟然沒看模板就敲出來了……

感覺這一版**好看多了呢……

不同的是這一版**的nxt陣列最長相等的字首字尾長,不用減一,同時兩個字串都從1開始編號。

**:2018/10/26版

#includeusing namespace std;

#define maxn 1000000

#define maxm 1000000

char a[maxn+5],b[maxn+5];

int n,m;

int nxt[maxn+5];

int main()

if(b[i]==b[j+1]) nxt[i]=j+1;

else nxt[i]=0; }

int j=1;

for(int i=1;i<=n;i++)

if(b[j+1]==a[i]) j++;

if(j==m) printf("%d\n",i-m+1); }

for(int i=1;i<=m;i++) printf("%d ",nxt[i]);

return 0;

}

2018/08/12版

#includeusing namespace std;

#define maxn 1000000

char a[maxn+5],b[maxn+5];

int lena,lenb;

int nxt[maxn+5];

int main()

if(b[j+1]==b[i]) nxt[i]=j+1;

else nxt[i]=-1;

} int i=0,j=0;

while(ifor(int i=0;ireturn 0;

}

模板 KMP字串匹配

顧名思義,就是一種用來進行字串匹配的演算法。這種演算法的核心就是乙個nxt陣列,表示在模式串的第i位失配後,應該跳到模式串的哪一位繼續匹配。為什麼要這樣?顯然,因為文字串是不確定的,所以在匹配的時候的nxt陣列肯定是按照模式串建的。其次,為什麼要設乙個nxt陣列呢?模 式串 abc ab c模式串 ...

模板 KMP字串匹配

題目鏈結 給出兩個字串 s1 和 s2,若 s1 的區間 l,r 子串與 s2 完全相同,則稱 s2 在 s1 現了,其出現位置為 l。現在請你求出 s2 在 s1 中所有出現的位置。定義乙個字串 s 的 border 為 s 的乙個非 s 本身的子串 t,滿足 t 既是 s 的字首,又是 s 的字...

模板 KMP字串匹配

顧名思義,就是一種用來進行字串匹配的演算法。這種演算法的核心就是乙個nxt陣列,表示在模式串的第i位失配後,應該跳到模式串的哪一位繼續匹配。為什麼要這樣?顯然,因為文字串是不確定的,所以在匹配的時候的nxt陣列肯定是按照模式串建的。其次,為什麼要設乙個nxt陣列呢?模式串 abcabc 文字串 ab...