KMP算法其实很好理解,就是在匹配串中找最近的相同的串。

  下面是HDU的2087:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<string>
 5 #define maxn 1005
 6 using namespace std;
 7 string s1,s2;
 8 int f[maxn],ans;
 9 void kmp(string &x,string &y)
10 {
11     int le=x.size(),j=0,ll=y.size();
12     for (int i=0;i<le;i++)
13     {
14         while (j&&x[i]!=y[j]) 
15             j=f[j];
16         if (x[i]==y[j]) j++;
17         if (j==ll) {
18             ans++;//j=0;
19         }
20     }
21 }
22 void find(string &x)
23 {
24     int ll=x.size(),j=0;
25     f[0]=0;f[1]=0;
26     for (int i=1;i<ll;i++)//从第二个点开始 
27     {
28         j=f[j];
29         while (j&&x[j]!=x[i]) j=f[j];
30         f[i+1]= x[j]==x[i] ? j+1 : 0;
31     }
32 }
33 int main()
34 {
35     //freopen("2087kmp.in","r",stdin);
36     while (cin>>s1&&s1[0]!='#')//cin不读空格 
37     {
38         cin>>s2;
39         memset(f,0,sizeof (f));
40         ans=0;
41         find(s2);
42         kmp(s1,s2);
43         cout<<ans<<endl;
44     }
45     return 0;
46 }
View Code

 

 posted on 2016-10-08 19:54  qzgxlx  阅读(124)  评论(0编辑  收藏  举报