擴充套件KMP題目總結

2021-09-28 17:27:00 字數 1417 閱讀 3541

問題定義:給定兩個字串s和t(長度分別為n和m),下標從0開始,定義extend[i]等於s[i]...s[n-1]與t的最長相同字首的長度,求出所有的extend[i]

顯然,如果在s的某個位置i有extend[i]等於m,則可知在s中找到了匹配串t,並且匹配的首位置是i。

#include

#include

using namespace std;

/* 求解 t 中 next,注釋參考 getextend() */

void getnext(string & t, int & m, int next)

else

next[i] = next[i - a];}}

/* 求解 extend */

void getextend(string & s, int & n, string & t, int & m, int extend, int next)

else

extend[i] = next[i - a];}}

int main()

return 0;

}aaaaabbb

aaaaac

next:   6 4 3 2 1 0

extend: 5 4 3 2 1 0 0 0

abcdef

next:   3 0 0

extend: 0 0 0

每組給你兩個字串s1和s2,求s2的所有字尾在s1**現的頻率,頻率再乘以對應的字尾的長度,累加。

我們將s1,s2字串翻轉,然後進行一次擴充套件kmp,得到extend陣列,然後對extend陣列上的每乙個值進行等差數列計算,就是最後結果。

#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define maxn 1000001

#define mod 1000000007

typedef long long ll;

using namespace std;

ll extend[maxn],next1[maxn];

int t;

char s[maxn],t[maxn];

void getnext(int tlen)

while (p=p)

while (p>t;

while (t--)

}

KMP 擴充套件KMP

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

擴充套件kmp

出自 2 i k l 1 p k,即i l p。這時,首先可以知道a i.p 和b 0.p i 是相等的 因為a i.p b i k.p k 而i k l 1 p k,由b 0.l 1 b i k.i k l 1 可得b 0.p i b i k.p k 即a i.p b 0.p i 然後,對於a p...

擴充套件KMP

拖了這麼久,終於打出擴充套件kmp了。並不長,但是細節很多。最好把模板背下來,實在背不下來就根據原理去推。相比於kmp來說擴充套件kmp的應用範圍更廣,更靈活。它的ext i 與kmp的next i 的區別就是next i 表示長度最大的一段s i next i 1 i t 1 next i ext...