KMP模板 例題

2021-08-04 05:54:35 字數 2262 閱讀 3196

文章**:

假設主串:s: s[1] s[2] s[3] ……s[n]

模式串:t: t[1] t[2] t[3]…..t[m]

現在我們假設主串第i 個字元與模式串的第j(j<=m)個字元『失配』後,主串第i 個字元與模式串的第k(k主串:   s[1]...s[i-j+1]...s[i-1]s[i]...

||(匹配)   ||    ≠

模式串:            t[1]...  t[j-1] t[j]

由此,可以得到關係式如下

t[1]t[2]t[3]...t[j-1] = s[i-j+1]...s[i-1]

由於s[i] != t[j],接下來s[i]將與t[k]繼續比較,則模式串中的前k-1咯字串必須滿足下列關係式,並且不可能存在k'>k滿足下列關係式:

t[1]t[2]t[3]...t[k-1] = s[j-k+1]s[j-k+2]...s[i-1] (k也就是說:

主串:  s[1]...s[i-k+1]s[i-k+2]...s[i-1]s[i]...

||        ||         ||    ?(待比較)

模式串:           t[1]      t[2]...  t[k-1] t[k]

現在可以把前面的關係綜合總結如下

s[1]...s[i-j+1]...s[i-k+1]s[i-k+2]...s[i-1]s[i]...

||          ||       ||           ||   ≠

t[1]...    t[j-k+1] t[j-k+2]...   t[j-1] t[j]

||       ||            ||    ?

t[1]     t[2] ...     t[k-1] t[k]

現在唯一的任務就是如何求k了,通過乙個next函式求。

/*

pku3461(oulipo), hdu1711(number sequence)

這個模板 字串是從0開始的

next陣列是從1開始的

*/#include #include using namespace std;

const int n = 1000002;

int next[n];

char s[n], t[n];

int slen, tlen;

void getnext()

/*返回模式串t在主串s中首次出現的位置

返回的位置是從0開始的。

*/int kmp_index()

else

j = next[j];

}if(j == tlen)

return i - tlen;

else

return -1;}/*

返回模式串在主串s中出現的次數

*/int kmp_count()

getnext();

for(i = 0; i < slen; i++)

}return ans;

}int main()

}return ans;

}int main()

return 0;

}

/*

poj 1611 period

sample input

3aaa

12aabaabaabaab

0sample output

test case #1

2 23 3

test case #2

2 26 2

9 312 4

題意就是求乙個字串中的重複子串

*/#include#include#include#includeusing namespace std;

const int maxn=1000010;

char str[maxn];

int next[maxn];

int n;

void getnext()

else k=next[k];

}}int main()

return 0;

}

KMP模板及例題

kmp演算法就是字串匹配演算法,在乙個字串t中查詢字串p的位置。include.h using namespace std const int maxn 1e6 10 int f maxn char t maxn p maxn void getfail void find int main find...

kmp演算法next例題 KMP演算法next陣列求解

kmp演算法與bf演算法的比較 bf演算法的想法十分樸素,即先將子串t的第一位與主串s的第一位對齊開始匹配,當不能匹配時將子串整體往後移一位,然後重新匹配,以此類推直至排出結果 如當遇到下圖所示情況時,需將子串整體後移一位,將i,j分別回溯到主串第2位和子串第一位。kmp演算法 對bf進行思考後,我...

KMP演算法例題 總結

kmp之前沒學,然後排位賽又有一道題考了這個知識點,這題ac了一列人,就差我乙個.kmp演算法 建立乙個next函式,從而使字串匹配的時間複雜度由o n n 變成o n m 舉個例子 ababcab 和 abbbcabdc 首先建立next陣列,next 0 1 ababcab 10012012就是...