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. ElasticSearch系列——查询、Python使用、Django/Flask集成、集群搭建,数据分片、位置坐标实现附近的人搜索

    @ 目录 Elasticsearch之-查询 一 基本查询 1.1 match查询 1.2 term查询 1.3 terms查询 1.4 控制查询的返回数量(分页) 1.5 match_all 查询 ...

  2. 【题解】《PTA-Python程序设计》题目集分享

    第1章-1 从键盘输入两个数,求它们的和并输出 (30 分) 本题目要求读入2个整数A和B,然后输出它们的和. 输入格式: 在一行中给出一个被加数在另一行中给出一个加数 输出格式: 在一行中输出和值. ...

  3. LVS+keepalived配置高可用架构和负载均衡机制(1)

    一.基础知识 1. 四层负载均衡(基于IP+端口的负载均衡) 所谓四层负载均衡,也就是主要通过报文中的目标ip地址和端口,再加上负载均衡设备设置的服务器选择方式(分发策略,轮询),决定最终选择的内部服 ...

  4. [最佳实践]配置sshd只允许sftp登录

    sftp 是 Secure File Transfer Protocol 的缩写,即安全文件传送协议,可为传输文件提供一种安全的加密方法. sftp 为 SSH 的一部分,由于这种传输方式使用了加密/ ...

  5. JNI编程之字符串处理

    java中的字符串类型是String,对应的jni类型是jstring,由于jstring是引用类型,所以我们不能像基本数据类型那样去使用它,我们需要使用JNIEnv中的函数去处理jstring,下面 ...

  6. 浅析SpringBoot加载配置的6种方式

    从配置文件中获取属性应该是SpringBoot开发中最为常用的功能之一,但就是这么常用的功能,仍然有很多开发者抓狂-今天带大家简单回顾一下这六种的使用方式: 说明 Environment对象 Envi ...

  7. Velocity之Hello World(入门实例)

    参考:http://blog.csdn.net/mengxuwq/article/details/1871161 (非常感谢这篇文章,让我初步入门) 自己调试完全能运行后,写在此,供新人参考,供自己温 ...

  8. 使用 Vue 3 插件(Plugin)实现 OIDC 登录和修改密码(OIDC 系统以 Keycloak 为例)

    背景 目前单位系统常用 Keycloak 作为认证系统后端,而前端之前写的也比较随意,这次用 Vue 3 插件以及 Ref 响应式来编写这个模块.另外,这个可能是全网唯一使用 keycloak 的 O ...

  9. c#中代理模式详解

    基本介绍:   "代理"顾名思义指以他人的名义,在授权范围内进行处理事情的意思.   在编程语言中的则解释为:为其他对象提供一种代理以控制对这个对象的访问.   从释义上不难解读, ...

  10. 【scipy 基础】--正交距离回归

    Scipy的ODR正交距离回归(ODR-Orthogonal Distance Regression)模块,适用于回归分析时,因变量和自变量之间存在非线性关系的情况.它提高了回归分析的准确性和稳健性. ...