您的位置:首页 > 其它

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很大的情况下,两者时间复杂度差别就差别很大了!
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: