參考部落格:
問題定義:給出兩個字串s和t(長度分別是n和m),下標從0開始,定義extend[ i ]表示s[ i ]......s[ n-1 ]與t的最長公共字首的長度,求出所有的extend[ i ],如下表i0
1234
567s
aaaa
abbb
taaa
aacextend[i]54
3210
00如果某個extend[ i ]=m,表示此處有乙個t的匹配,並且首位置為 i ,這樣就可以找到s中所有點t的匹配
輔助陣列next[ i ]:t[ i ].....t[ m-1 ]與t的最長相同的字首
模板:
#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
#define ll long long
const int mod=100000007;
const int inf=0x3f3f3f3f;
const ll inff=0x3f3f3f3f3f3f3f3f;
const ll n=15;
const ll m=15;
#define mef(x) memset(x,-1,sizeof(x))
#define me0(x) memset(x,0,sizeof(x))
#define mei(x) memset(x,inf,sizeof(x))
void getnext(string st,int len,int net)
while(p=p||i+net[i-a]>=p)
while(p>s>>t)
cout
return 0;}/*
樣例:aaaaabbb
aaaaac
答案:6 4 3 2 1 0
5 4 3 2 1 0 0 0
*/
擴充套件KMP模板(學習)
乙個算是冷門的演算法 在競賽上 不過其演算法思想值得深究。kmp的演算法思想,具體可以參考這篇 trie樹 字典樹 擴充套件kmp的模板問題 給你兩個字串s,t,長度分別為n,m。請輸出s的每乙個字尾與t的最長公共字首。雜湊是不可能的,這輩子都不可能的。mathcalac自動機?好像更不可做了。我們...
擴充套件KMP學習筆記
對於字串 s 定義 z i 為從位置 i 開始的 s 字尾與 s 的最長公共字首的長度。擴充套件 kmp 就是用於在 mathcal o n 複雜度下求解 z 函式的演算法。既然是擴充套件 kmp 那麼當然與 kmp 有一定的關係 這一點主要體現在思想上,兩者都在求解的過程中通過之前已經求解的答案來...
KMP 擴充套件KMP
本文將不斷加入例題,稍安勿躁,今天的總結爭取9 30寫完.kmp,中文名字叫字串匹配,用於解決一類字串匹配問題.先下一些定義 首先我們先想一想 nxt i 對於求解問題有怎樣的幫助.我們對於每乙個 t i s 1 的位置都匹配一次,這樣子複雜度為 theta n m 的.考慮在暴力匹配中其實我們不一...