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 */
相关文章: