hihoCoder #1015 : KMP算法

 

思路:里面讲得已经够清楚了,但是有点繁琐。别人的代码真是发挥到了极致!

 1 #include <iostream>

 2 #include <cstdio>

 3 #include <string>

 4 #include <cstring>

 5 #include <algorithm>

 6 using namespace std;

 7 void get_next(string &m, int *next)     //next数组要保证比m要大

 8 {

 9     next[0]=-1;

10     int i=0, j=-1;

11     while(i<m.size())

12     {

13         if(j==-1 || m[i]==m[j])      //j在原串上, i在模式串上

14             next[++i] = ++j;

15         else

16             j = next[j];

17     }

18 }

19 

20 int kmp(string &y, string &m,int *next )        //找到则返回索引

21 {

22     if(m.size()>y.size())   return 0;           //原串比模式串还小

23     int i=0, j=0, cnt=0;

24     while(i<y.size())

25     {

26         if(j==-1||y[i]==m[j])

27         {

28             i++;

29             j++;

30         }

31         else

32             j=next[j];

33         if(j==m.size()) cnt++;

34     }

35     return cnt;

36 }

37 

38 int main()

39 {

40     //freopen("input.txt", "r", stdin);

41     string m, y;

42     int next[10005];

43     int t;

44     cin>>t;

45     while(t--)

46     {

47         cin>>m>>y;

48         get_next(m, next);

49         cout<<kmp(y, m, next)<<endl;

50     }

51     return 0;

52 }
KMP

 

你可能感兴趣的:(code)