杭电3065(HDU3065)
来源:互联网 发布:sql语言怎么查询数据 编辑:程序博客网 时间:2024/05/24 00:53
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define N 2000010
struct node
{
node *fail;
node *next[128];
int count,id;
node()
{
fail=NULL;
count=0;
for(int i=0;i<128;i++)
next[i]=NULL;
}
}*q[200010];
node *root;
char str[N],a[1010][55];
int ans[1010];
void insert(char *s,int c)
{
node *p=root;
int i,j,len=strlen(s);
for(i=0;i<len;i++)
{
j=s[i];
if(p->next[j]==NULL)
p->next[j]=new node();
p=p->next[j];
}
p->count++;
p->id=c+1;
}
void build()
{
int i,j,head=0,tail=0;
node *p,*tmp;
q[tail++]=root;
while(head!=tail)
{
p=q[head++];
for(i=0;i<128;i++)
{
if(p->next[i]!=NULL)
{
if(p==root)
p->next[i]->fail=root;
else
{
tmp=p->fail;
while(tmp!=NULL)
{
if(tmp->next[i]!=NULL)
{
p->next[i]->fail=tmp->next[i];
break;
}
tmp=tmp->fail;
}
if(tmp==NULL)
p->next[i]->fail=root;
}
q[tail++]=p->next[i];
}
}
}
}
void query()
{
int i,j,len=strlen(str);
node *p=root,*tmp;
memset(ans,0,sizeof(ans));
for(i=0;i<len;i++)
{
j=str[i];
while(p->next[j]==NULL&&p!=root)
p=p->fail;
p=p->next[j];
if(p==NULL)
p=root;
tmp=p;
while(tmp!=NULL)
{
if(tmp->count>0)
ans[tmp->id]++;
tmp=tmp->fail;
}
}
}
void del(node *a)//由于数组较大且多次输入,所以每次结束后需要把空间释放出来,否则会MLT
{
for(int i=0;i<128;i++)
{
if(a->next[i]!=NULL)
del(a->next[i]);
delete(a->next[i]);
}
}
int main()
{
int n,i,j,k;
while(scanf("%d",&n)!=EOF)
{
root=new node();
for(i=0;i<n;i++)
{
scanf("%s",a[i]);
insert(a[i],i);
}
build();
scanf("%s",str);
query();
for(i=1;i<=n;i++)
if(ans[i])
printf("%s: %d\n",a[i-1],ans[i]);
del(root);
}
return 0;
}
#include<string.h>
#include<algorithm>
using namespace std;
#define N 2000010
struct node
{
node *fail;
node *next[128];
int count,id;
node()
{
fail=NULL;
count=0;
for(int i=0;i<128;i++)
next[i]=NULL;
}
}*q[200010];
node *root;
char str[N],a[1010][55];
int ans[1010];
void insert(char *s,int c)
{
node *p=root;
int i,j,len=strlen(s);
for(i=0;i<len;i++)
{
j=s[i];
if(p->next[j]==NULL)
p->next[j]=new node();
p=p->next[j];
}
p->count++;
p->id=c+1;
}
void build()
{
int i,j,head=0,tail=0;
node *p,*tmp;
q[tail++]=root;
while(head!=tail)
{
p=q[head++];
for(i=0;i<128;i++)
{
if(p->next[i]!=NULL)
{
if(p==root)
p->next[i]->fail=root;
else
{
tmp=p->fail;
while(tmp!=NULL)
{
if(tmp->next[i]!=NULL)
{
p->next[i]->fail=tmp->next[i];
break;
}
tmp=tmp->fail;
}
if(tmp==NULL)
p->next[i]->fail=root;
}
q[tail++]=p->next[i];
}
}
}
}
void query()
{
int i,j,len=strlen(str);
node *p=root,*tmp;
memset(ans,0,sizeof(ans));
for(i=0;i<len;i++)
{
j=str[i];
while(p->next[j]==NULL&&p!=root)
p=p->fail;
p=p->next[j];
if(p==NULL)
p=root;
tmp=p;
while(tmp!=NULL)
{
if(tmp->count>0)
ans[tmp->id]++;
tmp=tmp->fail;
}
}
}
void del(node *a)//由于数组较大且多次输入,所以每次结束后需要把空间释放出来,否则会MLT
{
for(int i=0;i<128;i++)
{
if(a->next[i]!=NULL)
del(a->next[i]);
delete(a->next[i]);
}
}
int main()
{
int n,i,j,k;
while(scanf("%d",&n)!=EOF)
{
root=new node();
for(i=0;i<n;i++)
{
scanf("%s",a[i]);
insert(a[i],i);
}
build();
scanf("%s",str);
query();
for(i=1;i<=n;i++)
if(ans[i])
printf("%s: %d\n",a[i-1],ans[i]);
del(root);
}
return 0;
}
阅读全文
0 0
- 杭电3065(HDU3065)
- hdu3065
- hdu3065
- HDU3065
- hdu3065
- hdu3065 AC自动机
- hdu3065之AC自动机
- hdu3065(ac自动机)
- hdu3065 AC自动机
- hdu3065 AC自动机
- HDU3065-AC自动机
- hdu3065 ac自动机
- hdu2896 & hdu3065 ac自动机
- [AC自动机][HDU3065]
- hdu3065(AC自动机)
- hdu3065 AC自动机
- AC自动机 HDU3065
- hdu3065 病毒侵袭持续中
- C语言基础之流程控制
- 在html中常用哪几种方式定义css
- 动态添加线程,然后监控多个线程是否都完成了
- 关于mathematica中添加注释的一些方法
- Java面向对象的三大特性之--《继承》
- 杭电3065(HDU3065)
- 40和的组合第二弹
- RecyclerView的安装包和source
- 函数
- POJ 1321 棋盘问题
- Bean的属性注入——为不同类型属性注值
- BZOJ 1797: [Ahoi2009]Mincut 最小割 图的联通 最小割 tarjan
- springboot + mybatis 多数据源最简解决方案
- 思维导图:一张图了解jQuery