主要思想:当当前某个字符匹配失败时,不是向纯暴力一样,将文本串匹配的起点往右移一格,而是将在模板中当前的匹配点左移到文本串当前点所能匹配到的最大的匹配点处。通过预处理出当文本串在模板某个位置匹配失败时,应跳转到的位置,即nex数组,将时间复杂度降低为O(m+n);
Kmp入门题目:Poj 3461\2752\2406\1961
nex[i]数组代表在模板i处匹配失败,模板中的匹配点应该移动到的位置。
Kmp 模板:
char s[N];
int nex[N];
void GetFail(){
int len=strlen(s);
nex[0]=nex[1]=0;
for(int i=1; i<=len; ++i){
int j=nex[i];
while(j&&s[j]!=s[i]){
j=nex[j];
}
nex[i+1]=s[i]==s[j]?j+1:0;
}
}