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