码迷,mamicode.com
首页 > 其他好文 > 详细

hdu2087__kmp

时间:2015-03-01 18:20:54      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:

与上题不同的是:

  在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

 

hdu2087__kmp

标签:

原文地址:http://www.cnblogs.com/-maybe/p/4307262.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!