HDU2896+AC自动机
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自动机的更多相关文章
- HDU2896(AC自动机入门题)
病毒侵袭 Time Limit:1000MS Memory Limit:32768KB Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这 ...
- 【HDU2896】病毒侵袭 AC自动机
[HDU2896]病毒侵袭 Problem Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这样的时刻,人们却异常兴奋--我们能在有生之年看到500年 ...
- hdu2896 病毒侵袭 AC自动机入门题 N(N <= 500)个长度不大于200的模式串(保证所有的模式串都不相同), M(M <= 1000)个长度不大于10000的待匹配串,问待匹配串中有哪几个模式串,
/** 题目:hdu2896 病毒侵袭 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2896 题意:N(N <= 500)个长度不大于200的模式串 ...
- HDU2896:病毒侵袭(AC自动机)
病毒侵袭 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- hdu2896病毒侵袭(ac自动机)
链接 ac自动机的模板题 说2个注意的地方 一是题目说明包含所有ASCII字符,可以开到0-127 包含空格 题目会输入多个源串,在加完当前的val值时,不应清0,可以开个标记数组. #include ...
- hdu2896 病毒肆虐【AC自动机】
病毒侵袭 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 病毒侵袭---hdu2896(AC自动机)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2896 输入的字符是所有可见的ASCII码(共有127个)所以要注意一下: 把结果存到一个数组中,然后输 ...
- HDU2896【AC自动机-模板】
思路: 因为不同病毒特征码不会相同. AC自动机,然后对于每一个输出即可. 注意:以上字符串中字符都是ASCII码可见字符(不包括回车);G++ MLE. //#include <bits/st ...
- HDu-2896 病毒侵袭,AC自动机模板题!
病毒侵袭 模板题,不多说了.. 题意:n个不同的字符串分别代表病毒特征,给出m次查询,每次一个字符串(网址),求这个字符串中有几个病毒特征,分别从大到小输出编号,最后输出所有的带病毒网址个数.格式请看 ...
随机推荐
- Cocos2d-x数据持久化-查询数据
数据查询一般会带有查询条件,这可以使用SQL语句的where子句实现,但是在程序中需要动态绑定参数给where子句.查询数据的具体操作步骤如下所示.(1) 使用sqlite3_open函数打开数据库. ...
- datatable dateset 载体传递数据、存储过程
第一部分:数据库通过存储过程读取数据,通过datatable接受,前台通过asp:repeater.DataSource()和binding()绑定数据 /// <summary> /// ...
- OpenGL7-1-快速绘制接口(使用高效的函数接口进行绘制)
代码下载 #include "CELLWinApp.hpp"#include <gl/GLU.h>#include <assert.h>#include & ...
- c#学习汇总-----------------多态
刚开通了博客园的博客,原因是我的师兄和前辈们在这里写的一些学习笔记让我受益匪浅,所以决定从今天起用这个平台来记录我的点滴学习心得.我喜欢GIS二次开发,以后应该也不会脱离于此,对于编程我积累的知识太零 ...
- FKCL-OS——自主的操作系统
我想搞一个操作系统,这是因为我对windows非常不满意,对linux非常讨厌,我想要开发一个真正自己的OS,然后让自己和别人使用它.得到方便.我将在这篇文章中写下我对操作系统的不满,然后构思出我的操 ...
- Linux C 程序 文件属性,文件删除(15)
dup ,dup2,fcntl,ioctl系统调用 . dup ,dup2 函数 int dup(int oldfd) int dup(int oldfd , int newfd) dup用来复制参数 ...
- apache重写字段详细说明
用Apache虚拟主机的朋友很多,apache提供的.htaccess模块可以为每个虚拟主机设定rewrite规则,这对网站SEO优化相当有用,同时也改善了用户体验.国内的虚拟机一般不提供.htacc ...
- 重写session
<?php ini_set('session.use_only_cookies', 0); $session_id = rand(10000, 99999); session_set_cooki ...
- Spark机器学习 Day2 快速理解机器学习
Spark机器学习 Day2 快速理解机器学习 有两个问题: 机器学习到底是什么. 大数据机器学习到底是什么. 机器学习到底是什么 人正常思维的过程是根据历史经验得出一定的规律,然后在当前情况下根据这 ...
- Oracle数据库间的数据复制 - SQLPlus中的COPY命令
Copy命令可以实现不同Oracle数据库间的数据的复制,也是可以实现同一数据库的数据复制,其性能表现和导入/导出相同. 根据9i文档,说Copy命令未来会不支持,但实际上Oracle 11g仍然支持 ...