POJ3461Oulipo KMP
http://poj.org/problem?id=3461
//LIMIT:1000ms 65536k
Memory: 1208K | Time: 110MS |
#include<cstdio> #include<iostream> using namespace std; const int maxn=10010; const int maxm=1000010; char a[maxm],b[maxn];//a为源串,b为待匹配串; int next[maxm]; void prekmp() { int j=-1;next[0]=-1; for(int i=1;b[i];++i) { while(j!=-1&&b[i]!=b[j+1]) j=next[j]; if(b[i]==b[j+1]) j++; next[i]=j; } } int kmp() { int j=-1,ret=0; for(int i=0;a[i];++i) { while(j!=-1&&a[i]!=b[j+1]) j=next[j]; if(a[i]==b[j+1]) j++; if(!b[j+1]) { ret++;j=next[j]; } } return ret; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%s",b); scanf("%s",a); prekmp(); int ans=kmp(); printf("%d\n",ans); } return 0; }