POJ 2896 AC自动机 or 暴力
DESCRIPTION :大意是说。给你n个代表病毒的字符串。m个表示网站的字符串。让你计算有多少个网站被病毒感染了。被那些病毒感染了。
刚开始就想暴力。然而,忽略了条件:每个网站最多有三个病毒。于是。TLE了。于是换AC 自动机。于是MLE了。于是把最大的结构体指针数组换成队列。用时间来换空间。23333
应该注意结构体的初始化是必须的。
附代码:
AC 自动机:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<queue>
#include<algorithm>
#include<map>
using namespace std;
#define T_SIZE 10000 struct trie{
trie* nexts[128];
trie* fail;
int num1, num2;
int mem;
trie(){
for(int i=0;i<128;i++){
nexts[i]=NULL;
}
fail=NULL;
num1= num2 = 0;
}
}; char T[T_SIZE+2];
queue<struct trie*>que;
int ans[50];
map<int, int>mm; void insert(trie* root,char* s, int m){
trie* p=root;
for(int i=0;s[i]!='\0';i++){
if(p->nexts[s[i]-0]==NULL)
p->nexts[s[i]-0]=new trie;
p=p->nexts[s[i]-0];
}
p->num1++;
p->mem = m;
} void build_ac_automation(trie* root){
que.push(root);
while(!que.empty()){
trie* fronts=que.front();
que.pop();
for(int i=0;i<128;i++){
if(fronts->nexts[i]!=NULL){
trie* p=fronts->fail;
while(p!=NULL){
if(p->nexts[i]!=NULL){
fronts->nexts[i]->fail=p->nexts[i];
break;
}
p=p->fail;
}
if(p==NULL){
fronts->nexts[i]->fail=root;
}
que.push(fronts->nexts[i]);
}
}
}
} int ac_find(trie* root,char* T){
trie* p=root;
int sum=0;
memset(ans,0,sizeof(ans));
for(int i=0,len=strlen(T);i<len;i++){
while(p->nexts[T[i]-0]==NULL && p!=root)
p=p->fail;
if(p->nexts[T[i]-0]!=NULL){
p=p->nexts[T[i]-0];
}
trie* temp=p;
temp->num2 = temp->num1;
while(temp!=root && temp->num2!=-1){
temp->num2 = temp->num1;
if (!mm[temp->mem])
{ans[sum]=temp->mem+1;
sum+=temp->num2;}
temp->num2=-1;
temp=temp->fail;
}
}
return sum;
} int main(){
int n;
while(scanf("%d",&n)!= EOF){
mm.clear();
int summ=0;
trie* root=new trie;
getchar();
for(int i=0;i<n;i++){
memset(T,0,sizeof(T));
gets(T);
insert(root,T, i);
}
build_ac_automation(root); int t;
scanf("%d",&t);
getchar();
for(int i=0;i<t;i++){
memset(T,0,sizeof(T));
gets(T);
int num=ac_find(root,T);
if(num!=0){
summ++;
printf("web %d:",i+1);
sort(ans, ans+num);
printf(" %d", ans[0]);
for(int j=1;j<num;j++){
if (ans[j] == ans[j-1])
continue;
printf(" %d",ans[j]);
}
printf("\n");
}
}
printf("total: %d\n",summ);
}
return 0;
}
POJ 2896 AC自动机 or 暴力的更多相关文章
- hdu 2896 AC自动机
// hdu 2896 AC自动机 // // 题目大意: // // 给你n个短串,然后给你q串长字符串,要求每个长字符串中 // 是否出现短串,出现的短串各是什么 // // 解题思路: // / ...
- HDU 2896 (AC自动机模板题)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2896 题目大意:多个模式串.多个匹配串.其中串的字符范围是(0~127).问匹配串中含有哪几个模式串 ...
- POJ 3691 (AC自动机+状态压缩DP)
题目链接: http://poj.org/problem?id=3691 题目大意:给定N个致病DNA片段以及一个最终DNA片段.问最终DNA片段最少修改多少个字符,使得不包含任一致病DNA. 解题 ...
- BZOJ 2754: [SCOI2012]喵星球上的点名 [AC自动机+map+暴力]
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1902 Solved: 837[Submit][St ...
- POJ 2778 (AC自动机+矩阵乘法)
POJ 2778 DNA Sequence Problem : 给m个只含有(A,G,C,T)的模式串(m <= 10, len <=10), 询问所有长度为n的只含有(A,G,C,T)的 ...
- hdu 2896 AC自动机模版题
题意:输出出现模式串的id,还是用end记录id就可以了. 本题有个关键点:“以上字符串中字符都是ASCII码可见字符(不包括回车).” -----也就说AC自动机的Trie树需要128个单词分支. ...
- Censored! POJ - 1625 AC自动机+大数DP
题意: 给出一n种字符的字典,有p个禁用的单词, 问能组成多少个不同的长度为m的合法字符串.(m<=50) 题解: 是不是个我们之前做的题目非常非常像,题意都一样. 直接将上次写的AC自动机+矩 ...
- Censored! - POJ 1625(ac自动机+简单dp+高精度运算)
题目大意:首先给一个字符集合,这个集合有N个字符,然后需要一个长度为M的句子,但是据子里面不能包含的串有P个,每个串里面的字符都是有字符集和里面的字符构成的,现在想知道最多能构造多少个不重复的句子. ...
- HDU 2896 AC自动机 裸题
中文题题意不再赘述 注意字符范围是可见字符,从32开始到95 char c - 32 #include <stdio.h> #include <string.h> #inclu ...
随机推荐
- dp练习 2016.2.24
很经典的一道状压dp(似乎叫做旅行商问题),用f[i][s]表示在到达点i,已经经过的城市用二进制表示为s,于是方程就很简单了: f[i][s] = min { f[j][s ^ (1 << ...
- Win32程序支持命令行参数的做法(转载)
转载:http://www.cnblogs.com/lanzhi/p/6470406.html 转载:http://blog.csdn.net/kelsel/article/details/52759 ...
- Delphi XE5 for Android (七)
Delphi XE5下,TMainMenu和TPopupMenu不可用,那么如何支持Android的菜单呢? 查看了一些资料,不得要领,只是摸索着先模拟一下吧. 首先在窗体上放置一个TPanel,在其 ...
- Python的递归
递归 是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象.在计算机编程里,递归指的是一个过程:函数不断引用自身,直到引用的对象已知.使用递归解决问题,思路清晰,代码少.但是在主流高 ...
- Mysql数据库基础知识
什么是Mysql数据库 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQ ...
- BZOJ 2648 kd-tree模板
学习了一下kd-tree的基本写法 http://blog.csdn.net/jiangshibiao/article/details/34144829 配合 http://www.bilibili. ...
- Django Python MySQL Linux 开发环境搭建
Django Python MySQL Linux 开发环境搭建 1.安装Python 进行Python开发,首先必须安装python,对于linux 或者Mac 用户,python已经预装. 在命令 ...
- Win10重命名文件夹导致资源管理器卡顿的解决办法
我本机使用的是 Win10 1607,不清楚是因为什么原因导致重命名文件夹时资源管理器会被卡死,找了很长时间终于找到了解决办法,现在我把步骤粘出来以便后续遇到相同问题的朋友能及时解决. 其实操作很简单 ...
- ubuntu-server14.04 网络配置
一.启动网卡 ubuntu server 安装后,ifconfig 发现只有一个lo 和一个p1p1 网卡, 先查看服务器网卡:ifconfig -a ,发现有lo ,p1p1,p2p1,p3p1,p ...
- Python day16 tag式整体退出技巧
在写一些服务器时,往往会多层嵌套循环,可利用tag变量实现整体退出功能,代码: tag=True while tag: print('level1') choice=input('level1> ...