poj 3461

View Code
 1 #include<iostream>
2 #include<cstring>
3 #include<cstdio>
4 using namespace std;
5 int n,m;
6 char s[1000010],p[10010];
7 int next[11111];
8 void get_next()
9 {
10 next[0]=-1;
11 for(int i=1,j=-1;i<m;i++){
12 while(j>=0&&p[j+1]!=p[i]) j=next[j];
13 if(p[j+1]==p[i]) j+=1;
14 next[i]=j;
15 }
16 }
17 int kmp()
18 {
19 int ans=0;
20 for(int i=0,j=-1;i<n;i++)
21 {
22 while(j>=0&&s[i]!=p[j+1]) j=next[j];
23 if(s[i]==p[j+1]) j+=1;
24 if(j==m-1) {
25 ans++;
26 j=next[j];
27 }
28 }
29 return ans;
30 }
31 int main()
32 {
33 int t;
34 scanf("%d",&t);
35 while(t--)
36 {
37 scanf("%s%s",p,s);
38 m=strlen(p);
39 n=strlen(s);
40 get_next();
41 printf("%d\n",kmp());
42 }
43 return 0;
44 }
posted @ 2012-03-20 18:33  静静的等待_93  阅读(117)  评论(0编辑  收藏  举报