HDOJ 2087

 1 // HDOJ 2087 KMP算法
 2 #include<iostream>
 3 using namespace std;
 4 
 5 #include<string>
 6 
 7 void nextval(char s2[],int next[],int len)
 8 {
 9         next[1] = 0;
10         int i = 1,j = 0;
11         while(i < len)//这里是小于号而不是小于等于是因为里面有自加,防止越界!
12         {
13                 if(j == 0 || s2[i] == s2[j])
14                 {
15                         ++i;
16                         ++j;
17                         if(s2[i] != s2[j]) next[i] = j;
18                         else next[i] = next[j];
19                 }
20                 else j = next[j];
21         }
22 }
23 
24 int KMP(char s1[],char s2[],int len1,int len2,int next[],int pos)
25 {
26         int i = pos,j = 1;
27         while(i <= len1 && j <= len2)
28         {
29                 if(j == 0 || s1[i] == s2[j])
30                 {
31                         ++i;
32                         ++j;
33                 }
34                 else j = next[j];
35         }
36         if(j > len2) return i;
37         else return 0;
38 }
39 
40 int main()
41 {
42         string s1,s2;
43         while(cin>>s1 && s1 != "#")
44         {
45                 cin>>s2;
46                 int next[s2.size()+1],c = 0,pp = 0;
47                 next[0] = -1;
48                 char c1[s1.size()+1],c2[s2.size()+1];
49                 for(int i = 1;i <= s1.size();++i) c1[i] = s1[i-1];
50                 for(int i = 1;i <= s2.size();++i) c2[i] = s2[i-1];
51                 nextval(c2,next,s2.size());
52                 for(int pos = 1;pos <= s1.size();)
53                 {
54                         pp = KMP(c1,c2,s1.size(),s2.size(),next,pos);
55                         if(pp)
56                         {
57                                 ++c;
58                                 pos = pp;
59                         }
60                         else break;
61                 }
62                 cout<<c<<endl;
63         }
64 
65         return 0;
66 }
posted @ 2012-12-02 21:26  maowang  阅读(259)  评论(0编辑  收藏  举报