ac自动机 模板题

 /*

 */
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<queue>
#include<map>
#include<stack>
#include<set>
#include<math.h>
using namespace std;
typedef long long int64;
//typedef __int64 int64;
typedef pair<int64,int64> PII;
#define MP(a,b) make_pair((a),(b))
const int maxn = ;
const int maxm = ;
const int inf = 0x7fffffff;
const double pi=acos(-1.0);
const double eps = 1e-; struct Tree{
int id;
Tree *fail;
Tree *next[ maxn ];
};
Tree root;
Tree *q[ ];
char str[ maxm ];
int tot;
int cnt[ ];
int Index_cnt ;
bool vis[ ]; void init(){
root.id = ;
root.fail = NULL;
for( int i=;i<maxn;i++ )
root.next[ i ] = NULL;
} void build( char str[],int ID ){
int len = strlen( str );
Tree *p = &root;
Tree *tmp = NULL;
for( int i=;i<len;i++ ){
int id = str[i]-;
if( p->next[ id ]==NULL ){
tmp = (Tree *)malloc(sizeof( root ));
tmp->id = ;
for( int j=;j<maxn;j++ )
tmp->next[ j ] = NULL;
p->next[ id ] = tmp;
p = p->next[ id ];
}
else
p = p->next[ id ];
}
p->id = ID;
return ;
} void build_AC(){
int head = ,tail = ;
Tree *p = &root;
Tree *tmp = NULL;
q[ tail++ ] = p;
while( head!=tail ){
p = q[ head++ ];
for( int i=;i<maxn;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( char str[] ){
int len = strlen( str );
Tree *p = &root;
Tree *tmp = NULL;
for( int i=;i<len;i++ ){
int id = str[i]-;
while( p->next[id]==NULL&&p!=(&root) ){
p = p->fail;
}
p = p->next[ id ];
if( p==NULL )
p = &root;
tmp = p;
while( tmp!=(&root) ){
if( tmp->id!=&&vis[tmp->id]==false ){
vis[tmp->id] = true;
cnt[ Index_cnt++ ] = tmp->id;
}
tmp = tmp->fail;
}
}
return ;
} int main(){
int n,m;
while( scanf("%d",&n)!=EOF ){
init();
char s[ ];
for( int i=;i<=n;i++ ){
scanf("%s",s);
build( s,i );
}
build_AC();
scanf("%d",&m);
tot = ;
for( int i=;i<=m;i++ ){
scanf("%s",str);
Index_cnt = ;
memset( vis,false,sizeof( vis ) );
query( str );
if( Index_cnt!= ) {
tot++;sort( cnt,cnt+Index_cnt );
printf("web %d:",i);
for( int j=;j<Index_cnt;j++ )
printf(" %d",cnt[j]);
printf("\n");
}
}
printf("total: %d\n",tot);
}
return ;
}

HDU2896+AC自动机的更多相关文章

  1. HDU2896(AC自动机入门题)

    病毒侵袭 Time Limit:1000MS     Memory Limit:32768KB   Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这 ...

  2. 【HDU2896】病毒侵袭 AC自动机

    [HDU2896]病毒侵袭 Problem Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这样的时刻,人们却异常兴奋--我们能在有生之年看到500年 ...

  3. hdu2896 病毒侵袭 AC自动机入门题 N(N <= 500)个长度不大于200的模式串(保证所有的模式串都不相同), M(M <= 1000)个长度不大于10000的待匹配串,问待匹配串中有哪几个模式串,

    /** 题目:hdu2896 病毒侵袭 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2896 题意:N(N <= 500)个长度不大于200的模式串 ...

  4. HDU2896:病毒侵袭(AC自动机)

    病毒侵袭 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  5. hdu2896病毒侵袭(ac自动机)

    链接 ac自动机的模板题 说2个注意的地方 一是题目说明包含所有ASCII字符,可以开到0-127 包含空格 题目会输入多个源串,在加完当前的val值时,不应清0,可以开个标记数组. #include ...

  6. hdu2896 病毒肆虐【AC自动机】

    病毒侵袭 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  7. 病毒侵袭---hdu2896(AC自动机)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2896 输入的字符是所有可见的ASCII码(共有127个)所以要注意一下: 把结果存到一个数组中,然后输 ...

  8. HDU2896【AC自动机-模板】

    思路: 因为不同病毒特征码不会相同. AC自动机,然后对于每一个输出即可. 注意:以上字符串中字符都是ASCII码可见字符(不包括回车);G++ MLE. //#include <bits/st ...

  9. HDu-2896 病毒侵袭,AC自动机模板题!

    病毒侵袭 模板题,不多说了.. 题意:n个不同的字符串分别代表病毒特征,给出m次查询,每次一个字符串(网址),求这个字符串中有几个病毒特征,分别从大到小输出编号,最后输出所有的带病毒网址个数.格式请看 ...

随机推荐

  1. Swift属性

    属性的存储 属性的主要作用是存储数据,可以常量属性和变量属 性: struct FixedLengthRange { var firstValue: Int let length: Int } var ...

  2. c#输出json,其中包含子json (可以含 无限级 子json)的方法思路

    首页 给出  DataTable 转Json 的方法: public static string TableToJson(DataTable dt) { List<Dictionary<s ...

  3. ASP.NET中使用开源插件zTree的小结

    在最近的项目应用中,找到了zTree免费的好东西,这里总结一下: 源码下载:http://www.ztree.me/ 效果是酱紫的: 前台代码: 样式和脚本 <link rel="st ...

  4. pl/sql developer 中文字段显示乱码

    在windows中创建一个名为“NLS_LANG”的系统环境变量,设置其值为“SIMPLIFIED CHINESE_CHINA.ZHS16GBK”,然后重新启动 pl/sql developer,这样 ...

  5. JavaScript---Cookie

    用JavaScript创建.获取.删除Cookie的例子 1.创建cookie function setCookies(cName,cValue,exTimes){ var d = new Date( ...

  6. 20分钟入门Redux

    Redux就是个数据中心,不依附于任何框架在哪使用都行.但是和它最搭配的应该就是React了,而且大家学习它的动力大多也是解决React状态管理的问题.都说Redux文档详尽清晰,但我感觉并不友好,它 ...

  7. robolectric环境的搭建

    最近在学习测试驱动开发(Test-Driven Development),测试驱动开始是极限编程的一种方式,提倡在真正编写代码之前先根据需求编写测试代码(当然这个测试代码是不可能通过的),然后根据测试 ...

  8. 专家解说IT行业存在哪些安全风险

    本人为原创作品:e良师益友 ,转载是并且注明 网络带动了IT行业的发展,同时也带来了安全风险,国外的专家分析2014年IT行业存在的11个安全隐患,随着越来越多技术的不断开发,为方便人们记忆账号,产生 ...

  9. 停车场管理软件附带源代码 J2EE服务端+android客户端

    该源码是停车场管理软件附带源代码 J2EE服务端+android客户端,也是一套停车场管理车辆进出的管理软,喜欢的朋友可以看看吧. 应用的后台管理主要功能介绍:1  机构管理 ,机构有从属管理< ...

  10. C 语言循环之break、continue

    在C 编程的过程中,我们很多时候都会用到循环,但有时需要中途跳出整个循环,或跳过某一次循环,这时就需要用到break或continue,关于二者的使用很多书籍和博文都有很相近的说明,此处不做任何讲解, ...