hdu1686 KMP
简单KMP 求单词出现的次数。直接可以考虑,在每一次匹配成功时,让ans++,k=next[k],直到结束。
#include<stdio.h> #include<string.h> #define maxn 1000010 #define ll 100010 int next[ll]; char s[maxn],p[ll]; void getnext() { int j,k,len=strlen(p); j=0; k=-1; next[0]=-1; while(j<len) { if(k==-1||p[j]==p[k]) { j++; k++; next[j]=k; } else { k=next[k]; } } } void kmp() { int i,k,len=strlen(s),ans=0; getnext(); i=0; k=0; while(i<len) { if(k==-1||s[i]==p[k]) { i++; k++; } else { k=next[k]; } if(k==strlen(p)) { ans++;//记录次数 k=next[k]; } } printf("%d\n",ans); } int main() { int i,j,t; scanf("%d",&t); while(t--) { scanf("%s %s",p,s); kmp(); } }