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 */ 

posted on 2012-08-02 16:46  mycapple  阅读(179)  评论(0编辑  收藏  举报

导航