POJ 3641 Oulipo KMP 水题
http://poj.org/problem?id=3461
直接KMP就好。水题
#include<cstdio> #include<cstring> const int MAXN=10000+10; const int MAXM=1000000+10; char P[MAXN],T[MAXM]; int f[MAXN],n,m,ans; void getFail() { f[0]=f[1]=0; for(int i=1;i<n;i++){ int j = f[i]; while(j && P[i] != P[j]) j=f[j]; if( P[i]==P[j]) j++; f[i+1] = j ; } } void kmp() { int j=0; for(int i=0;i<m;i++){ while(j && T[i] != P[j]) j=f[j]; if( T[i]==P[j]) j++; if(j==n) ans++; } } int main() { int kase; scanf("%d",&kase); while(kase--) { ans=0; scanf("%s%s",P,T); n=strlen(P); m=strlen(T); getFail(); kmp(); printf("%d\n",ans); } }
新 blog : www.hrwhisper.me