HDU 2222- Keywords Search

 1 //一般方法

 2 #include<stdio.h>

 3 #include<stdlib.h>

 4 #include<string.h>

 5 char a[10001][51],b[10000001];

 6 int main()

 7 {

 8     int i,j,k,la,lb,m,n,count;

 9     scanf("%d",&m);

10     while(m--)

11     {

12         for(scanf("%d",&n),count=i=0;i<n;++i)

13             scanf("%s",a[i]);

14         scanf("%s",b);

15         lb=strlen(b);

16         for(k=0;k<n;k++)

17         {

18             la=strlen(a[k]);

19             for(i=0;i<=lb-la;i++)

20             {

21                 for(j=0;j<la;j++)

22                     if(b[i+j]!=a[k][j])

23                         break;

24                 if(j>=la)

25                     count++;

26             }

27         }

28         printf("%d\n",count);

29     }

30     system("pause");

31     return 0;

32 }

33 

34 /*//改进的KMP算法

35 #include<stdio.h>

36 #include<stdlib.h>

37 #include<string.h>

38 int next[52],la,lb;

39 char a[10001][52],b[10000001];

40 void GetNext(char T[])

41 {

42     int j=1,k=0;

43     next[1]=0;

44     while(j<=la)

45     {

46         if(k==0||T[j]==T[k])

47         {

48             ++j;

49             ++k;

50             if(T[k]==T[j])

51                 next[j]=next[k];

52             else

53                 next[j]=k;

54         }

55         else

56             k=next[k];

57   }

58 }

59 int KMP(char S[],char T[])

60 {

61     int j,k,cnt;

62     for(k=1,cnt=0;k<=lb-la+1;cnt++,k=k-la+1)

63     {

64         j=1;

65         while(j<=la&&k<=lb)

66         {

67             if(j==0||S[k]==T[j]){++k;++j;}

68             else j=next[j];

69         }

70         if(j<=la) break;

71     }

72     return cnt;

73 }

74 int main()

75 {

76     int i,m,n,count;

77     scanf("%d",&m);

78     while(m--)

79     {

80         for(scanf("%d",&n),count=i=0;i<n;++i)

81             scanf("%s",a[i]+1);

82         for(scanf("%s",b+1),lb=strlen(b+1),i=0;i<n;++i)

83         {

84             la=strlen(a[i]+1);

85             GetNext(a[i]);

86             count+=KMP(b,a[i]);

87         }

88         printf("%d\n",count);

89     }

90     system("pause");

91     return 0;

92 }

93 //上面两种方法都能AC,OJ上提交的结果是两者在时间复杂度与空间复杂度都一样,

94 //但我认为两者在时间复杂度上是不同的,第一种内循环核心是一般子串查找算法,

95 //而第二种里的核心内循环是改进的KMP算法,前者的时间复杂度为O(m*n),后者则是O(m+n),

96 //所以在m,n很大的情况下,两者时间复杂度差别就差别很大了!

97 */ 

你可能感兴趣的:(search)