hdu2087__kmp

与上题不同的是:

  在ans++; 后,要同时把j=0;

  因为这道找出来的子序列不允许重叠,2个子序列要是重叠只能取其一嘛。

 1 #include<cstdio>
 2 #include<cstring>
 3 const int max=1000+10;
 4 char p[max];
 5 char t[max];
 6 int f[max];
 7 int ans;
 8 void getfail()
 9 {
10     int m=strlen(p);
11     f[0]=f[1]=0;
12     for(int i=1;i<m;i++){
13         int j=f[i];
14         while(j&&p[j]!=p[i])
15             j=f[j];
16         f[i+1]=p[j]==p[i]?j+1:0;
17     }
18 }
19 void kmp()
20 {
21     int n=strlen(t);
22     int m=strlen(p);
23     int j=0;
24     for(int i=0;i<n;i++){
25         while(j&&p[j]!=t[i])
26             j=f[j];
27         if(p[j]==t[i])
28             j++;
29         if(j==m){
30             ans++;
31             j=0;
32         }
33     }
34 }
35 int main()
36 {
37     while(true){
38         scanf("%s",&t);
39         if(t[0]=='#')
40             break;
41         scanf("%s",&p);
42         ans=0;
43         kmp();
44         printf("%d\n",ans);
45     }
46     return 0;
47 }
View Code

 

posted on 2015-03-01 16:56  _fukua  阅读(157)  评论(0编辑  收藏  举报