poj 3987 Computer Virus on Planet Pandora —— ac自动机复习
poj 3987 Computer Virus on Planet Pandora ac自动机复习
题意如下
给出多个模式串,最后给出一个文本串,求有多少个模式串被文本串包含或者被反序的文本串包含几乎是ac自动机模板,正反跑两次就行了。但是当时板子怎么写忘记了,队里也没带资料,于是没调出来。说明还是基本功不够熟练
代码如下
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int t, n, co = 0, ans = 0;
char pat[1005];
char ss[5100005];
char ss2[5100005];
int que[500005];
bool vis[500005];
struct trie
{
int fl;
int fail;
int nxt[26];
} aca[500005];
void insert(char *s, int l)
{
int o = 0;
int p = 0;
int ls = strlen(s);
while (p < ls)
{
if (!aca[o].nxt[s[p] - 'A'])
{
aca[o].nxt[s[p] - 'A'] = ++co;
}
o = aca[o].nxt[s[p] - 'A'];
++p;
}
++aca[o].fl;
}
void fail_p()
{
int hd = 1, tl = 1;
for (int i = 0; i < 26; ++i)
{
if (aca[0].nxt[i])
{
que[tl++] = aca[0].nxt[i];
aca[aca[0].nxt[i]].fail = 0;
}
}
while (hd != tl)
{
int u = que[hd++];
for (int i = 0; i < 26; ++i)
{
if (aca[u].nxt[i])
{
aca[aca[u].nxt[i]].fail = aca[aca[u].fail].nxt[i];
que[tl++] = aca[u].nxt[i];
}
else
{
aca[u].nxt[i] = aca[aca[u].fail].nxt[i];
}
}
}
}
void query(char *s)
{
int o = 0;
int l = strlen(s);
vis[0] = true;
for (int i = 0; i < l; ++i)
{
int sn = aca[o].nxt[s[i] - 'A'];
while (!vis[sn])
{
ans += aca[sn].fl;
vis[sn] = true;
sn = aca[sn].fail;
}
o = aca[o].nxt[s[i] - 'A'];
}
o = 0;
for (int i = l - 1; i >= 0; --i)
{
int sn = aca[o].nxt[s[i] - 'A'];
while (sn && !vis[sn])
{
ans += aca[sn].fl;
vis[sn] = true;
sn = aca[sn].fail;
}
o = aca[o].nxt[s[i] - 'A'];
}
}
int main()
{
scanf("%d", &t);
while (t--)
{
aca[0].fl = aca[0].fail = 0;
for (int i = 0; i < 26; ++i)
{
aca[0].nxt[i] = 0;
}
co = 0;
ans = 0;
memset(vis, 0, sizeof(vis));
memset(aca, 0, sizeof(aca));
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
{
scanf("%s", pat);
insert(pat, i);
}
fail_p();
scanf("%s", &ss2);
int ll = -1;
int l2 = strlen(ss2);
for (int i = 0; i < l2; ++i)
{
if (ss2[i] != '[')
{
ss[++ll] = ss2[i];
}
else
{
int x = 0;
int j;
for (j = 1; ss2[i + j + 1] != ']'; ++j)
{
x = x * 10 + ss2[i + j] - '0';
}
char c = ss2[i + j];
i += j + 1;
while (x)
{
ss[++ll] = c;
--x;
}
}
}
ss[++ll] = 0;
query(ss);
printf("%d\n", ans);
}
return 0;
}
poj 3987 Computer Virus on Planet Pandora —— ac自动机复习的更多相关文章
- POJ 3987 Computer Virus on Planet Pandora (AC自动机优化)
题意 问一个字符串中包含多少种模式串,该字符串的反向串包含也算. 思路 解析一下字符串,简单. 建自动机的时候,通过fail指针建立trie图.这样跑图的时候不再跳fail指针,相当于就是放弃了fai ...
- HDU 3695 / POJ 3987 Computer Virus on Planet Pandora
Computer Virus on Planet Pandora Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1353 ...
- 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 / POJ 3987 Computer Virus on Planet Pandora(AC自动机)(2010 Asia Fuzhou Regional Contest)
Description Aliens on planet Pandora also write computer programs like us. Their programs only consi ...
- HDU3695 - Computer Virus on Planet Pandora(AC自动机)
题目大意 给定一个文本串T,然后给定n个模式串,问有多少个模式串在文本串中出现,正反都可以 题解 建立好自动机后.把文本串T正反各匹配一次,刚开始一直TLE...后面找到原因是重复的子串很多以及有模式 ...
- 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 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 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
HDU-3695 Computer Virus on Planet Pandora 题意:电脑中病毒了, 现在n钟病毒指令, 然后有一个电脑指令, 看一下这个电脑指令中了几个病毒, 如果电脑种了某一个 ...
随机推荐
- Travelling Salesman and Special Numbers
prologue 模拟赛的一道题,结果没做出来,丢大人,败大兴.所以过来糊一篇题解. analysis 我们看到数据范围这么大,那么肯定不可以一个一个遍历(废话),所以就要考虑这个题目的性质. 我们先 ...
- 2023_10_09_MYSQL_DAY_01_笔记
2023_10_09_MYSQL_DAY_01 #运算符的优先级 SELECT ename, job, sal FROM emp WHERE ( job='SALESMAN' OR job='PRES ...
- NPOI在EXCEL中插入图片和超链接
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 使用 DDPO 在 TRL 中微调 Stable Diffusion 模型
引言 扩散模型 (如 DALL-E 2.Stable Diffusion) 是一类文生图模型,在生成图像 (尤其是有照片级真实感的图像) 方面取得了广泛成功.然而,这些模型生成的图像可能并不总是符合人 ...
- 银河麒麟V10 修改文件夹权限
并不建议修改系统文件夹的权限,防止终端失效 指令:获取所有权限 指令:写入可执行权限 chmod +x filename//filename 是文件路径 TRANSLATE with x Englis ...
- Python 利用pandas 和 matplotlib绘制柱状图
当你需要展示数据时,图表是一个非常有用的工具.Python 中的 pandas 和 matplotlib 库提供了丰富的功能,可以帮助你轻松地绘制各种类型的图表.本文将介绍如何使用这两个库,绘制一个店 ...
- 资源迁移OSS方案记录
视频资源迁移到OSS服务器上,记录一下迁移过程. 搭建流程 在阿里云上购买oss,并获取具有该Bucket访问权限的AccessKey ID和AccessKey Secret信息. 数据迁移方案一 第 ...
- testre
f5看到关键代码判断 猜测这是flag或者是加密后的结果,直接将其当作flag答案不对,所以猜测为加密后的结果,然后再通过其他函数了解 跟进第一个函数发现编码表 本来想试试base解密,可是当时只试了 ...
- Meissel–Lehmer 算法
前言 推荐先行阅读我的blog文章----Min_25 筛 什么是Meissel–Lehmer 算法 Meissel-Lehmer 算法是一种基于 \(ϕ\) 函数的的快速计算前缀质数个数(当然也可以 ...
- 激发创新,助力研究:CogVLM,强大且开源的视觉语言模型亮相
激发创新,助力研究:CogVLM,强大且开源的视觉语言模型亮相 CogVLM 是一个强大的开源视觉语言模型(VLM).CogVLM-17B 拥有 100 亿视觉参数和 70 亿语言参数. CogVLM ...