kmp演算法用來做什麼[1
,n
]a[1,n]
a[1,n]
是否為字串b[1
,m
]b[1,m]
b[1,m]
的子串,並求出a
aa在b
bb中各次出現的位置。
關於雜湊求解
由於雜湊代替各種字串的做法比較固定,此處不做介紹。
kmp演算法的小複習
f ai
l[i]
fail[i]
fail[i
]表示「a
aa中以i
ii結尾的非字首子串」與「a
aa的字首」能夠匹配的最長長度,即:
f ai
l[i]
=max
,j
a[i−
j+1,
i]=a
[1,j
]fail[i]=max\,jfa
il[i
]=ma
x,ja[i−
j+1,
i]=a
[1,j
]
fail[1]=0;
for(int i=2,j=0;i<=n;i++)
f[i
]f[i]
f[i]
表示「b
bb中以i
ii結尾的子串」與「a
aa的字首」能夠匹配的最大長度,即:
f [i
]=ma
x,j≤
i,b[
i−j+
1,i]
=a[i
,j
]f[i]=max\,j\leq i,b[i-j+1,i]=a[i,j]
f[i]=m
ax,j
≤i,b
[i−j
+1,i
]=a[
i,j]
for(int i=1;j=0;i<=m;i++)
放在一起就得到最後的kmp演算法:
#include #include #include #include #include #define db double
#define sg string
#define ll long long
#define rel(i,x,y) for(ll i=(x);i<(y);i++)
#define rep(i,x,y) for(ll i=(x);i<=(y);i++)
#define red(i,x,y) for(ll i=(x);i>=(y);i--)
#define res(i,x) for(ll i=head[x];i;i=nxt[i])
using namespace std;
const ll n=1e6+5;
const ll inf=1e18;
const db eps=1e-10;
char a[n],b[n];ll n,m,f[n],fail[n];
inline ll read()
while(ch>='0'&&ch<='9')
return f?-x:x;
}void kmp()
for(int i=1,j=0;i<=m;i++)
} for(int i=1;i<=n;i++) printf("%lld ",fail[i]);
}int main()
KMP匹配演算法複習。。
kmp演算法 knuth morris pratt algorithm knuth就是高德納。kmp演算法是從樸素匹配演算法改進而來 就是窮搜匹配。樸素匹配演算法 原串 abcde 模式串 acd 1.將原串和模式串左對齊,然後一位一位比較,直到有乙個字元不匹配 2.發現第二位的b和c不匹配,模式串...
簡單模式匹配演算法和KMP演算法
參見原文 簡單模式匹配演算法 經典的模式匹配,是讓模式串的首字元從主串的首字元開始向右匹配。匹配的規則是 1.在主串的第i個位置,讓pos i,如果主串pos位置的字元等於模式串的第乙個字元,則pos 再與模式串的第二個字元進行匹配。2.如果又相等則繼續向下匹配,直到匹配到模式串的結尾,就說明主串中...
模式匹配 KMP演算法
字串匹配演算法 include includeusing namespace std define ok 1 define error 0 define overflow 2 typedef int status define maxstrlen 255 使用者可在255以內定義最長串長 typed...