HDU 1686

View Code
 1 //hdu2087 

 2 #include <iostream>

 3 #include <string>

 4 #include <cstring>

 5 using namespace std;

 6 string str1,str2; 

 7 int next[1005];

 8 void get()

 9 {

10     int i = 0;

11     int j = -1;

12     memset(next,0,sizeof(next));

13     next[0] = -1;//不加的话会死循环,因为 j = next[j](j=0) 会赋一个垃圾数字 

14     while(i<str2.length())

15     {

16         if(j==-1||str2[i]==str2[j])

17         {

18             i++;

19             j++;

20             next[i] = j;

21         }

22         else

23             j = next[j];

24     }

25 }

26 int kmp()

27 {

28     int i = 0, j = 0;

29     int cnt = 0;

30     while(i<str1.length())

31     {

32         if(j==-1||str1[i]==str2[j])

33         {

34             i++;

35             j++;

36              if(j==str2.length())

37              {

38                 cnt++;

39                 j=0;

40              }

41         }

42         else

43             j = next[j];

44     }

45     return cnt;

46 }  

47 int main()

48 {

49     while(cin>>str1)

50     {

51         if(str1[0]=='#')

52             break;

53         cin>>str2;

54         get();

55         int cnt = kmp();

56         cout<<cnt<<endl;

57         str1.clear();

58         str2.clear();

59     }

60     return 0;

61 }

 

 1 //模式串在主串中出现次数

 2 //估计find会超时 

 3 //不论哪一个next函数均可AC 

 4 #include <iostream>

 5 #include <cstring>

 6 #include <string>

 7 using namespace std;

 8 string s1,s2;

 9 int next[10005];

10 void get()

11 {

12     int i = 0;

13     int j = -1;

14     memset(next,0,sizeof(next));

15     next[0] = -1;//不加的话会死循环,因为 j = next[j](j=0) 会赋一个垃圾数字 

16     while(i<s1.length())

17     {

18         if(j==-1||s1[i]==s1[j])

19         {

20             i++;

21             j++;

22            // if(s1[i]!=s1[j])

23                 next[i] = j;

24            // else

25                // next[i] = next[j];

26         }

27         else

28             j = next[j];

29     }

30 }

31 int kmp()

32 {

33     int i = 0, j = 0;

34     int cnt = 0;

35     while(i<s2.length())//(i<=(s2.length()-s1.length()))不行 

36     {

37         if(j==-1||s1[j]==s2[i])

38         {

39             i++;

40             j++;

41         }

42         else

43             j = next[j];

44         if(j==s1.length())

45         {

46             cnt++;

47             j = next[j];//此处改为j = 0就变成减花布条那一题啦 

48         }

49     }

50     return cnt;

51 }  

52 int main()

53 {

54     int i,j,k,T;

55     cin>>T;

56     while(T--)

57     {

58         s1.clear();

59         s2.clear();

60         cin>>s1;

61         cin>>s2;

62         get();

63         int cnt = kmp();

64         cout<<cnt<<endl;

65     }

66     return 0;

67 }

68         

69     
View Code
//超时,即便全为C风格也超时 

#include <iostream>

#include <cstring>

#include <string>

using namespace std;

string s1,s2;

int next[10005];

void get()

{

    int i = 0;

    int j = -1;

    memset(next,0,sizeof(next));

    next[0] = -1;//不加的话会死循环,因为 j = next[j](j=0) 会赋一个垃圾数字 

    while(i<s1.length())

    {

        if(j==-1||s1[i]==s1[j])

        {

            i++;

            j++;

            if(s1[i]!=s1[j])

                next[i] = j;

            else

                next[i] = next[j];

        }

        else

            j = next[j];

    }

}

int kmp()

{

    int i = 0, j = 0;

    int cnt = 0;

    while(i<s2.length())//(i<=(s2.length()-s1.length()))不行 

    {

        if(j==-1||s1[j]==s2[i])

        {

            i++;

            j++;

            if(j==s1.length())

            {

                cnt++;

                i = i-j+1;

                j = 0;

            }

        }

        else

            j = next[j];

    }

    return cnt;

}  

int main()

{

    int i,j,k,T;

    cin>>T;

    while(T--)

    {

        s1.clear();

        s2.clear();

        cin>>s1;

        cin>>s2;

        get();

        int cnt = kmp();

        cout<<cnt<<endl;

    }

    return 0;

}

        

    

 

你可能感兴趣的:(HDU)