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自动机复习的更多相关文章

  1. POJ 3987 Computer Virus on Planet Pandora (AC自动机优化)

    题意 问一个字符串中包含多少种模式串,该字符串的反向串包含也算. 思路 解析一下字符串,简单. 建自动机的时候,通过fail指针建立trie图.这样跑图的时候不再跳fail指针,相当于就是放弃了fai ...

  2. HDU 3695 / POJ 3987 Computer Virus on Planet Pandora

      Computer Virus on Planet Pandora Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1353 ...

  3. hdu ----3695 Computer Virus on Planet Pandora (ac自动机)

    Computer Virus on Planet Pandora Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 256000/1280 ...

  4. 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 ...

  5. HDU3695 - Computer Virus on Planet Pandora(AC自动机)

    题目大意 给定一个文本串T,然后给定n个模式串,问有多少个模式串在文本串中出现,正反都可以 题解 建立好自动机后.把文本串T正反各匹配一次,刚开始一直TLE...后面找到原因是重复的子串很多以及有模式 ...

  6. hdu 3695 Computer Virus on Planet Pandora(AC自己主动机)

    题目连接:hdu 3695 Computer Virus on Planet Pandora 题目大意:给定一些病毒串,要求推断说给定串中包括几个病毒串,包括反转. 解题思路:将给定的字符串展开,然后 ...

  7. hdu 3695:Computer Virus on Planet Pandora(AC自动机,入门题)

    Computer Virus on Planet Pandora Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 256000/1280 ...

  8. 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 ...

  9. HDU 3695 Computer Virus on Planet Pandora(AC自动机模版题)

    Computer Virus on Planet Pandora Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 256000/1280 ...

  10. HDU-3695 Computer Virus on Planet Pandora

    HDU-3695 Computer Virus on Planet Pandora 题意:电脑中病毒了, 现在n钟病毒指令, 然后有一个电脑指令, 看一下这个电脑指令中了几个病毒, 如果电脑种了某一个 ...

随机推荐

  1. Go语言系列——31-自定义错误、32-panic和recover、33-函数是一等公民(头等函数)、34-反射、35-读取文件、36-写入文件

    文章目录 31-自定义错误 使用 New 函数创建自定义错误 使用 Errorf 给错误添加更多信息 使用结构体类型和字段提供错误的更多信息 使用结构体类型的方法来提供错误的更多信息 32-panic ...

  2. Insert a scratch project into a ppt (MSPowerPoinT file)在powerpoint中播放Scratch动画

    Insert a scratch project into a ppt (MSPowerPoinT file)在powerpoint中播放Scratch动画 Contributed by liu pe ...

  3. Python - 读取CSV文件发现有重复数据,如何清洗以及保存为CSV文件,这里有完整的过程!!!! 片尾有彩蛋

    语言:Python 功能: 1.清洗CSV文件中重复数据. 2.保存为CSV文件 大体流程: 1.首先观察CSV文件中的数据布局格式如何? 2.通过csv包读取数据.并根据规则使用continue,来 ...

  4. 【Unity3D】Shader Graph简介

    1 Shader Graph 简介 ​ Shader Graph 是 Unity 官方在 2018 年推出的 Shader 制作插件,是图形化的 Shader 制作工具,类似于 Blender 中的 ...

  5. 一篇了解springboot3请求参数种类及接口测试

    SpringBoot3数据请求: 原始数据请求: //原始方式 @RequestMapping("/simpleParam") public String simpleParam( ...

  6. LCT(link cut tree) 详细图解与应用

    樱雪喵用时 3days 做了 ybtoj 的 3 道例题,真是太有效率了!!1 写死自己系列. 为了避免自己没学明白就瞎写东西误人子弟,这篇 Blog 拖到了现在. 图片基本沿用 OIwiki,原文跳 ...

  7. fread实现getchar(加速!!!)

    fread实现的getchar代码: inline char get() { static char buf[100000], *p1 = buf, *p2 = buf; return p1 == p ...

  8. MySQL简易教程

    本文是参考廖雪峰老师的,但是网站广告有点多,我就在本地抄写一份,一方面是为了加强记忆巩固基础,另一方面也是就是为了第一方面.廖雪峰老师Mysql教程直达地址:https://www.liaoxuefe ...

  9. alibaba fastjson的JsonObject有序的实现和源码分析

    介绍 FastJson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean.在使用的过程中, ...

  10. 怎样给边框添加阴影?CSS3属性box-shadow帮你搞定!

    作者:WangMin 格言:努力做好自己喜欢的每一件事 关于box-shadow属性,有的小伙伴可能用的时候直接复制已有的,并没有仔细了解过box-shadow属性的参数分别是什么含义,最后导致阴影的 ...