字典树与KMP模板
#include <stdio.h>
#include <string.h>
const int N=1010;
char s1[N],s2[N];
int next[N];
int len1,len2;
void getNext(){
int i=1,j=0;
next[1]=0;
while(i<=len1){//优化后的next函数
if(j==0||s2[i]==s2[j]){
i++;j++;
if(s2[i]!=s2[j]) next[i]=j;
else next[i]=next[j];
}
else j=next[j];
}
}
/*优化前的next函数
void getnext(){
int i = 1, j = 0;
next[1] = 0;
while(i <= len1){
if(j == 0 || s2[i] == s2[j]){
i++, j++;
next[i] = j;
}else{
j = next[j];
}
}
}*/
int kmp(){
int i,j;
int res=0;
for(i=1,j=0;i<=len1;i++){
while(j>0&&s2[j+1]!=s1[i]) j=next[j];
if(s2[j+1]==s1[i]) j++;
if(j==len2){
res++;
j=0;
}
}
return res;
}
int main(){
int i,j,res;
while(scanf("%s",s1+1)!=EOF){
if(strcmp(s1+1,"#")==0) break;
scanf("%s",s2+1);
len1=strlen(s1+1);
len2=strlen(s2+1);
getNext();
printf("%d\n",kmp());
}
return 0;
}
字典树KMP优先队列完整学习资源打包:点击下载
本文深入解析字典树与KMP算法,提供优化的next函数实现及KMP模板代码,并通过实例展示如何高效匹配字符串,助力算法理解和实践。
9万+

被折叠的 条评论
为什么被折叠?



