poj3461 KMP

#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; char a[10005],b[1000005]; int nexta[10005]; void getnext(){ int len=strlen(a); nexta[0]=-1; int k=-1; int j=0; while(j<len) { if(k==-1||a[j]==a[k]){ ++j; ++k; if(a[j]!=a[k]) nexta[j]=k; else nexta[j]=nexta[k]; } else k=nexta[k]; } } int kmp() { int len_a=strlen(a); int len_b=strlen(b); int count=0; int j=0; int i=0; while(j<len_b){ if(i==-1||a[i]==b[j]){ i++; j++; } else i=nexta[i]; if(i==len_a){ count++; i=nexta[i]; } } return count; } int main() { int n; scanf("%d",&n); while(n--) { scanf("%s%s",a,b); getnext(); int temp=kmp(); printf("%d\n",temp); } return 0; }


你可能感兴趣的:(poj3461 KMP)