HDU 3695 Computer Virus on Planet Pandora (AC自己主动机)
题意:有n种病毒序列(字符串),一个模式串,问这个字符串包括几种病毒。
包括相反的病毒也算。字符串中[qx]表示有q个x字符。具体见案列。
0 < q <= 5,000,000尽然不会超,无解
3
2
AB
DCB
DACB
3
ABC
CDE
GHI
ABCCDEFIHG
4
ABB
ACDEE
BBB
FEEE
A[2B]CD[4E]F
0
3
2HintIn the second case in the sample input, the reverse of the program is ‘GHIFEDCCBA’, and ‘GHI’ is a substring of the reverse, so the program is infected
by virus ‘GHI’.
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<string>
#include<queue>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
const int kind = 26;
const int maxn = 250*1000; //注意RE,单词长度*单词个数
const int M = 5100000;
struct node
{
node *fail;
node *next[kind];
int count;
node()
{
fail = NULL;
count = 0;
memset(next,0,sizeof(next));
}
}*q[maxn];
char keyword[1010],str[M],str1[M];
int head,tail;
void insert(char *str,node *root)
{
node *p=root;
int i=0,index;
while(str[i])
{
index = str[i] - 'A';
if(p->next[index]==NULL)
p->next[index] = new node();
p = p->next[index];
i++;
}
p->count++;
} void build_ac(node *root)
{
int i;
root->fail=NULL;
q[head++]=root;
while(head!=tail)
{
node *temp = q[tail++];
node *p=NULL;
for(i=0;i<26;i++)
{
if(temp->next[i]!=NULL)
{
if(temp==root)
temp->next[i]->fail=root;//失败指针指向root
else
{
p = temp->fail;
while(p!=NULL)
{
if(p->next[i]!=NULL)
{
temp->next[i]->fail=p->next[i];
break;
}
p=p->fail;
}
if(p==NULL)
temp->next[i]->fail=root;
}
q[head++]=temp->next[i];
}
}
}
} int query(node *root)
{
int i=0,cnt=0,index,len=strlen(str);
node *p=root;
while(str[i])
{
index = str[i]-'A';
while(p->next[index]==NULL&&p!=root)
p = p->fail;
p=p->next[index];
p=(p==NULL)?root:p;
node *temp = p;
while(temp!=root&&temp->count!=-1)//沿失配边走,走过的不走
{
cnt+=temp->count;
temp->count=-1;
temp=temp->fail;
}
i++;
}
return cnt;
} int value(int p,int q)
{
int i,ans=0,w=1;
for (i=q;i>=p;i--)
{
ans+=(str1[i]-'0')*w;
w*=10;
} return ans;
}
int main()
{
int n,t;
scanf("%d",&t);
while(t--)
{
head=tail=0;
node *root = new node();
scanf("%d",&n);
while(n--)
{
scanf("%s",keyword);
insert(keyword,root);
}
build_ac(root);
scanf("%s",str1);
int l=strlen(str1),i,j,k; j=0;
for (i=0;i<l;)
{
if (str1[i]!='[') str[j++]=str1[i++];
else
{
/*for (k=i+1;str1[k]!=']';k++);
int v=0,w=1;
for (int l=k-2;l>=i+1;l--)
{
v+=(str1[l]-'0')*w;
w*=10;
} */
int v=0;
i++;
while(str1[i]>='0'&&str1[i]<='9')
{
v=v*10+str1[i]-'0';
i++;
}
for (int k1=1;k1<=v;k1++) str[j++]=str1[i]; i+=2;
}
}
str[j]='\0';
//printf("%s\n",str); int h=query(root);
char chh; l=strlen(str);
for (i=0;i<=(l-1)/2;i++)
{
chh=str[l-i-1];
str[l-i-1]=str[i];
str[i]=chh;
}
//printf("%s",str);
h+=query(root);
printf("%d\n",h);
}
return 0;
}
/*
3
2
AB
DCB
DACB
3
ABC
CDE
GHI
ABCCDEFIHG
4
ABB
ACDEE
BBB
FEEE
A[2B]CD[4E]F
*/
HDU 3695 Computer Virus on Planet Pandora (AC自己主动机)的更多相关文章
- hdu 3695 Computer Virus on Planet Pandora(AC自己主动机)
题目连接:hdu 3695 Computer Virus on Planet Pandora 题目大意:给定一些病毒串,要求推断说给定串中包括几个病毒串,包括反转. 解题思路:将给定的字符串展开,然后 ...
- hdu ----3695 Computer Virus on Planet Pandora (ac自动机)
Computer Virus on Planet Pandora Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 256000/1280 ...
- hdu 3695:Computer Virus on Planet Pandora(AC自动机,入门题)
Computer Virus on Planet Pandora Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 256000/1280 ...
- HDU 3695 Computer Virus on Planet Pandora(AC自动机模版题)
Computer Virus on Planet Pandora Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 256000/1280 ...
- AC自动机 - 多模式串的匹配 --- HDU 3695 Computer Virus on Planet Pandora
Problem's Link Mean: 有n个模式串和一篇文章,统计有多少模式串在文章中出现(正反统计两次). analyse: 好久没写AC自动机了,回顾一下AC自动机的知识. 本题在构造文章的时 ...
- HDU3695 - Computer Virus on Planet Pandora(AC自动机)
题目大意 给定一个文本串T,然后给定n个模式串,问有多少个模式串在文本串中出现,正反都可以 题解 建立好自动机后.把文本串T正反各匹配一次,刚开始一直TLE...后面找到原因是重复的子串很多以及有模式 ...
- POJ 3987 Computer Virus on Planet Pandora (AC自动机优化)
题意 问一个字符串中包含多少种模式串,该字符串的反向串包含也算. 思路 解析一下字符串,简单. 建自动机的时候,通过fail指针建立trie图.这样跑图的时候不再跳fail指针,相当于就是放弃了fai ...
- hdu 3695 10 福州 现场 F - Computer Virus on Planet Pandora 暴力 ac自动机 难度:1
F - Computer Virus on Planet Pandora Time Limit:2000MS Memory Limit:128000KB 64bit IO Format ...
- HDU 3695 / POJ 3987 Computer Virus on Planet Pandora
Computer Virus on Planet Pandora Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1353 ...
随机推荐
- UOJ#400. 【CTSC2018】暴力写挂
传送门 看到要求两棵树的 \(lca\) 深度不太好操作 考虑枚举第二棵树的 \(lca\),这样剩下的都是只和第一棵树有关的 而注意到 \(dis(x,y)=d(x)+d(y)-2d(lca(x,y ...
- HTTP协议教程
文章内容: 1.HTTP协议概述 2.URL知识概述 3.HTTP消息结构详解 1.HTTP协议概述 定义: 超文本传送协议 (HTTP-Hypertext transfer protocol) 是分 ...
- ioctl
在驱动程序里, ioctl() 函数上传送的变量 cmd 是应用程序用于区别设备驱动程序请求处理内容的值. cmd除了可区别数字外,还包含有助于处理的几种相应信息. cmd的大小为 32位,共分 4 ...
- zabbix连不上数据库
[root@localhost etc]# tail -f /var/log/zabbix_server.log 1267:20130722:195451.493 [Z3001] connection ...
- 解决Spring框架下中文乱码的问题
在使用了Spring框架下回发现很多表单交互的地方会发生乱码,而且写到数据库中也是乱码,这其实还是字符编码的问题,在我们还在用自己写的servlet的时候,直接在request和response加上字 ...
- c#多线程调用有参数的方法
Thread (ParameterizedThreadStart) 初始化 Thread 类的新实例,指定允许对象在线程启动时传递给线程的委托. Thread (ThreadStart) 初始 ...
- HBuilder设置APP状态栏
一. 前言 状态栏就是手机屏幕最顶部的区域,包括了:信号.运营商.电量等信息.通常APP都有属于自己的色调风格,为了达到整体视觉美观,通常会设置状态栏和标题栏的色调设置成一致. 图例: 二.状态栏状态 ...
- ajax实现跨域请求
因为现在一直用的mvc,所以就以mvc来说说ajax跨域提交. 首先说说跨域,简单说就是不同域名访问,比如在aaa.com访问bbb.com. 就拿招聘网站来说,分为两种用户,求职者和企业,求职者端是 ...
- DB2问题记录本
1.System.Data.OleDb.OleDbException (0x80004005): 未指定的错误. 场景:部署网站到IIS上,使用oledb连接DB2数据库报错,开发环境正常 解决方案: ...
- rabbitmq集群步骤
这里选用三台主机,主机名分别是hidden1, hidden2, hidden3 主机名一定要修改成不一样的,要不然加入集群的时候会加入不成功 修改完主机名后,在/etc/hosts文件中加入对应的解 ...