擴充套件KMP 講解 模版 例題

2022-05-19 19:52:58 字數 1457 閱讀 1514

在閱讀這篇文章之前,我們假定你已經掌握了kmp:n+1次探裡的定義。

擴充套件kmp解決的是源串s的每乙個字尾與模式串p的最長公共字首的長度的問題,並求解出答案extend陣列,例如,ababac與aba的extend陣列是3 0 3 0 1 0,這裡extend[i]表示s[i:5](i從0開始)與p[0:2]的最長公共字首的長度。

這裡的next陣列與kmp裡的不同。

next[i]表示從i開始的p的字尾與p的最長公共字首的長度,也就是,p對p求擴充套件kmp,可以參見2019 multi-university training contest 5 - 1006 - string matching。

我們先假設已經有了next陣列,來求extend,因為next陣列的求法是和extend一樣的。

我們假設在前面匹配時,向右匹配到的最遠座標為last,是從first開始匹配的,也就是說s[first:last]=p[0:last-first]。可以推出s[i:last]=p[i-first:last-first],但這個不是和p的開頭匹配,還不能用,我們取extend[i]=min(last-i+1, next[i-first]),看看p[i-first:last-first]和p開頭有多少相同。然後向後檢測extend[i]能不能更大,這一塊暴力,別忘了最後更新first和last。

暴力檢測s和p最大公共字首長度extend[0]。

和上面一樣。next的0位置必定是p的長度,**中last初值設為0是為了避免初始化。

hdu2328

給一堆字串,求最長公共字串。

找乙個最短的串,暴力求出每乙個字尾,和所有串匹配,找到每個extend裡最大的,取總體最小,是乙個答案,找到所有答案裡長度最長的字典序最小的,就是答案。

#include#include#include#include#include#include#define ll long long

#define db double

#define ioss ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)

using namespace std;

int n,cnt;

ll ext[220],nex[220];

string skr[4020];

string ans[4020];

void getnext(string &strp,ll nextt)

}}void exkmp(string &strp,string &strs,ll nextt,ll extt)

}}int main()

}for(int i=0;i0)

else if(mn>ans[1].size())}}

if(cnt)

else cout<<"identity lost"<}

return 0;

}

擴充套件kmp演算法講解

參考文章 一.擴充套件kmp得到的是什麼 字串a,b。b是模式串 子串 求解a i lena 1 與b的最長公共字首,記錄在陣列ex i 中 二.演算法實現 分為兩步,第一步是對b模式串進行處理也是求b i,blen 1 與b的最長公共字首,用next陣列儲存,第二部是將a與b進行匹配,其實他們的方...

KMP 擴充套件KMP

本文將不斷加入例題,稍安勿躁,今天的總結爭取9 30寫完.kmp,中文名字叫字串匹配,用於解決一類字串匹配問題.先下一些定義 首先我們先想一想 nxt i 對於求解問題有怎樣的幫助.我們對於每乙個 t i s 1 的位置都匹配一次,這樣子複雜度為 theta n m 的.考慮在暴力匹配中其實我們不一...

KMP模板 例題

文章 假設主串 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 由此,可...