POJ3461
#include<stdio.h> #include<stdlib.h> #include<string.h> #define N 1000005 int next[N],len1,len2,ans; char s1[N],s2[N]; void getnext(){ int k,j; len1=strlen(s1); next[0]=-1; j=0; k=-1; while(j<len1){ if(k==-1||s1[k]==s1[j]){ k++; j++; next[j]=k; } else k=next[k]; } return ; } int kmp(){ int j,k,cnt; len2=strlen(s2); j=k=0; cnt=1; getnext(); while(j<len2&&k<len1){ if(k==-1||s2[j]==s1[k]){ j++; k++; } else k=next[k]; if(k==len1){ ans++; k=next[k]; } } return ans; } int main(){ int i,j,k; scanf("%d",&k); while(k--){ ans=0; scanf("%s%s",s1,s2); kmp(); printf("%d\n",ans); } return 0; }
简单的KMP
就是查看第一个字符串在第二个字符串中出现的次数。
keep moving...