擴充套件kmp習題

2021-07-10 02:33:11 字數 1304 閱讀 6443

題意:給t組資料,每組資料第一行是26個字母表示[a,z]所對應的密文字母。第二行的字串由兩部分組成,第一部分是密文部分,第二部分是明文部分。明文部分可能是不完整的,也可能是完整的輸出完整的明文部分

做法二(做法一是用kmp收錄在kmp習題大全中):首先求出前一部分的把密文換成明文的字串c。原字串s是密文+明文,更改後的字串c則是明文加其餘字母,以s為模式,c為原串進行匹配求出ex[i].當ex[i] + i >= n && i >= ex[i](也就是說密文開始的地方要大於等於明文的長度。等於就是接上因為i是從零開始的)然後分別輸出密文和明文。

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn=

200000

;int nexta[maxn];

int extend[maxn];

void

ekmp

(char s,

char t)

//s主串,t模式串

nexta[1]

= k;

k =1;

int p,l,j;

for(

int i =

2; i < tlen; i ++)

else

nexta[i]

= j;

k = i;}}

for(k =

0;k < len && s[k]

== t[k];k ++

) extend[0]

= k;

k =0;

for(

int i =

1; i < slen; i ++)

else

extend[i]

= j;

k = i;}}

}char s[maxn],tab[maxn],

c[maxn];

map<

char

,char

>map1;

intmain

()for

(int i=

0;iprintf

("%c"

,s[i]);

for(

int i=

0;iprintf

("%c"

,map1[s[i]]);

printf("

\n");}

return0;

}

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...