題意:給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...