HDU 2222- Keywords Search
2012-08-02 16:46
267 查看
//一般方法 #include<stdio.h> #include<stdlib.h> #include<string.h> char a[10001][51],b[10000001]; int main() { int i,j,k,la,lb,m,n,count; scanf("%d",&m); while(m--) { for(scanf("%d",&n),count=i=0;i<n;++i) scanf("%s",a[i]); scanf("%s",b); lb=strlen(b); for(k=0;k<n;k++) { la=strlen(a[k]); for(i=0;i<=lb-la;i++) { for(j=0;j<la;j++) if(b[i+j]!=a[k][j]) break; if(j>=la) count++; } } printf("%d\n",count); } system("pause"); return 0; } /*//改进的KMP算法 #include<stdio.h> #include<stdlib.h> #include<string.h> int next[52],la,lb; char a[10001][52],b[10000001]; void GetNext(char T[]) { int j=1,k=0; next[1]=0; while(j<=la) { if(k==0||T[j]==T[k]) { ++j; ++k; if(T[k]==T[j]) next[j]=next[k]; else next[j]=k; } else k=next[k]; } } int KMP(char S[],char T[]) { int j,k,cnt; for(k=1,cnt=0;k<=lb-la+1;cnt++,k=k-la+1) { j=1; while(j<=la&&k<=lb) { if(j==0||S[k]==T[j]){++k;++j;} else j=next[j]; } if(j<=la) break; } return cnt; } int main() { int i,m,n,count; scanf("%d",&m); while(m--) { for(scanf("%d",&n),count=i=0;i<n;++i) scanf("%s",a[i]+1); for(scanf("%s",b+1),lb=strlen(b+1),i=0;i<n;++i) { la=strlen(a[i]+1); GetNext(a[i]); count+=KMP(b,a[i]); } printf("%d\n",count); } system("pause"); return 0; } //上面两种方法都能AC,OJ上提交的结果是两者在时间复杂度与空间复杂度都一样, //但我认为两者在时间复杂度上是不同的,第一种内循环核心是一般子串查找算法, //而第二种里的核心内循环是改进的KMP算法,前者的时间复杂度为O(m*n),后者则是O(m+n), //所以在m,n很大的情况下,两者时间复杂度差别就差别很大了! */
相关文章推荐
- hdu2222 Keywords Search
- hdu 2222 Keywords Search (ac_automaton)
- HDU-2222 Keywords Search
- HDU 2222 Keywords Search
- HDU 2222 Keywords Search
- HDU2222---Keywords Search
- hdu 2222 Keywords Search (AC自动机~)
- Hdu 2222 Keywords Search
- HDU 2222 Keywords Search
- HDU 2222 Keywords Search (AC自动机)
- HDU 2222 Keywords Search
- 【hdu 2222】Keywords Search 中文题意&题解&代码(C++)
- HDU 2222 Keywords Search
- HDU 2222 Keywords Search
- 【hdu 2222】Keywords Search
- HDU 2222 Keywords Search (AC 自动机入门)
- HDU 2222 Keywords Search (AC自动机)
- HDU 2222 Keywords Search (AC自动机)
- HDU 2222 Keywords Search
- HDU 2222 Keywords Search