hdu2087__kmp

与上题不同的是:

  在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

 

你可能感兴趣的:(HDU)