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. DBA容灾与备份恢复:闪回应用及实践(一)

    闪回应用及实践 针对主机故障.网络故障.系统软件故障.存储介质故障.人为操作失误等各类故障,可以通过RAC.RMAN.Data Guard等成熟的解决方案来处理,不过对于人为操作失误防范的首推技术还是 ...

  2. ProcessingJS

    ProcessingJS 图形 rect(x, y, w, h)(在新窗口中打开) ellipse(x, y, w, h) triangle(x1, y1, x2, y2, x3, y3) line( ...

  3. JNI编程之java层和native层的数组数据的交互

    一.前言 JNI中的数组类型分为基本类型数组和引用类型数组,他们的处理方式是不一样的.基本类型数组中的元素都是jni基本数据类型,可以直接访问:但是引用类型的数组中的元素是一个类的实例,不能直接访问, ...

  4. 虹科干货 | 什么是Redis数据集成(RDI)?

    大量的应用程序.日益增长的用户规模.不断扩展的技术需求,以及对即时响应的持续追求.想想这些是否正是你在经历的.也许你尝试过自己构建工具来应对这些需求,但是大量的编码和集成工作使你焦头烂额.那你是否知道 ...

  5. shell脚本之语句(条件、循环)

    条件语句 1.测试 使用[]时要使用空格,注意格式  格式1:test 条件表达式  格式2:[ 条件表达式 ]#注意空格  注意[]空格,否则会失败  测试 是否成功使用 $?返回值来判断  [ 操 ...

  6. 数据结构与算法 | 记忆化搜索(Memorize Search)

    在本系列的文章中已经写了二叉树(Binary Tree).深搜(DFS)与广搜(BFS).哈希表(Hash Table)等等,计划接下来要写的是动态规划(Dynamic Programming,DP) ...

  7. 聊聊分布式 SQL 数据库Doris(三)

    详细内容阅读: Apache Doris 分区分桶新功能 与 数据划分. 在此基础上做总结与延伸. 在 Doris 的存储引擎规则: 表的数据是以分区为单位存储的,不指定分区创建时,默认就一个分区. ...

  8. 🔥🔥Java开发者的Python快速进修指南:自定义模块及常用模块

    好的,按照我们平常的惯例,我先来讲一下今天这节课的内容,以及Java和Python在某些方面的相似之处.Python使用import语句来导入包,而Java也是如此.然而,两者之间的区别在于Pytho ...

  9. 手动部署Kraft模式Kafka集群

    手动部署Kraft模式kafka集群 基本信息 IP地址 Hostname Release Kafka-Version 172.29.145.157 iamdemo1 Centos7.9 kafka_ ...

  10. Codeforces Round 883 (Div. 3)

    Codeforces Round 883 (Div. 3) A. Rudolph and Cut the Rope 题意:有一颗糖果在连在绳子上,求剪短多少根绳子,他能落地 思路:只要绳子长度比钉子高 ...