第二道AC自动机的题目了,之前参考的是网上一个博客算法,不怎么好,难写而且占空间

后来参照大白书做的这题,代码简洁多了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <string>
#include <queue>
#define N 12000
using namespace std;
map<string,int> mc; //防止模板里出现重复的
struct AutoTrie
{
int ch[N][];
int val[N];
int f[N];
int cnt[N];
int last[N];
int sz;
void init()
{
memset(ch[],,sizeof ch[]);
memset(cnt,,sizeof cnt);
//memset(val,0,sizeof val);
//memset(f,0,sizeof f);
mc.clear();
sz=;
}
int idx(char c)
{
return c-'a';
}
void insert(char* s,int v)
{
int u=;
int n=strlen(s);
for (int i=; i<n; i++)
{
int c=idx(s[i]);
if (!ch[u][c])
{
memset(ch[sz],,sizeof ch[sz]);
val[sz]=;
ch[u][c]=sz++;
}
u=ch[u][c];
}
val[u]=v;
mc[string(s)]=v;
}
void print(int j)
{
if (j)
{
cnt[val[j]]++;
print(last[j]);
}
}
void find(char *T)
{
int j=;
int n=strlen(T);
for (int i=; i<n; i++)
{
int c=idx(T[i]);
while (j && !ch[j][c]) j=f[j];
j=ch[j][c];
if (val[j]) print(j);
else if (last[j])
print(last[j]);
}
}
void build ()
{
queue<int> q;
f[]=;
for (int c=; c<; c++)
{
int u=ch[][c];
if (u)
{
f[u]=;
last[u]=;
q.push(u);
}
}
while (!q.empty())
{
int r=q.front();
q.pop();
for (int c=; c<; c++)
{
int u=ch[r][c];
if (!u) continue;
q.push(u);
int v=f[r];
while (v && !ch[v][c]) v=f[v];
f[u]=ch[v][c];
last[u]=val[f[u]]?f[u]:last[f[u]];
}
}
}
};
AutoTrie ac;
char cc[][];
char T[];
int main()
{
int n;
while (scanf("%d",&n))
{
if (!n) break;
ac.init();
for (int i=; i<=n; i++)
{
scanf("%s",cc[i]);
ac.insert(cc[i],i);
}
ac.build();
scanf("%s",T);
ac.find(T);
int sum=-;
for (int i=; i<=n; i++)
{
if (ac.cnt[i]>sum) sum=ac.cnt[i];
// cout<<i<<" "<<ac.cnt[i]<<endl;
}
printf("%d\n",sum);
for (int i=; i<=n; i++)
{
if (ac.cnt[mc[string(cc[i])]]==sum)
{
printf("%s\n",cc[i]);
}
}
}
return ;
}

UVALive 4670 AC自动机的更多相关文章

  1. LA 4670 (AC自动机 模板题) Dominating Patterns

    AC自动机大名叫Aho-Corasick Automata,不知道的还以为是能自动AC的呢,虽然它确实能帮你AC一些题目.=_=|| AC自动机看了好几天了,作用就是多个模式串在文本串上的匹配. 因为 ...

  2. LA 4670 AC自动机

    题意:给一个字典,看这个字典中匹配最多次数的是哪个单词(可以有多个). 分析: AC自动机就是用来解决多模式匹配问题的工具. 模板用的lrj的,相比HDU 2222,动态开辟字典树.用last数组统计 ...

  3. La 4670 AC自动机(模版)

    #include<iostream> #include<cstring> #include<queue> #include<cstdio> #inclu ...

  4. UVALive 4670 Dominating Patterns --AC自动机第一题

    题意:多个模板串,一个文本串,求出那些模板串在文本串中出现次数最多. 解法:AC自动机入门模板题. 代码: #include <iostream> #include <cstdio& ...

  5. UVALive 4670 Dominating Patterns (AC自动机)

    AC自动机的裸题.学了kmp和Trie以后不难看懂. 有一些变化,比如0的定义和f的指向,和建立失配边,以及多了后缀连接数组last.没有试过把失配边直接当成普通边(一开始还是先这样写吧). #inc ...

  6. 沉迷AC自动机无法自拔之:[UVALive 4126] Password Suspects

    图片加载可能有点慢,请跳过题面先看题解,谢谢 一看到这么多模式串就非常兴奋,又是\(AC\)自动机 题目就是要求:经过 \(n\) 个节点,把所有单词都遍历一遍的方案数,和那道题差不多嘛 所以这样设: ...

  7. LA 4670 Dominating Patterns (AC自动机)

    题意:给定n个字符串和一个文本串,查找哪个字符串出现的次数的最多. 析:一匹配多,很明显是AC自动机.只需要对原来的进行修改一下,就可以得到这个题的答案, 计算过程中,要更新次数,并且要映射字符串.如 ...

  8. UVALive - 3490 Generator (AC自动机+高斯消元dp)

    初始有一个空串s,从前n个大写字母中不断随机取出一个字母添加到s的结尾,出现模式串t时停止,求停止时s的长度期望. 这道题解法不唯一,比较无脑的方法是对模式串t建一个单串AC自动机,设u为自动机上的一 ...

  9. UVALive - 4126 Password Suspects (AC自动机+状压dp)

    给你m个字符串,让你构造一个字符串,包含所有的m个子串,问有多少种构造方法.如果答案不超过42,则按字典序输出所有可行解. 由于m很小,所以可以考虑状压. 首先对全部m个子串构造出AC自动机,每个节点 ...

随机推荐

  1. JAVA笔记01 变量的取名

    第2章 有意义的命名2.1 介绍2.2 名副其实 变量名太随意,haha.list1.ok 这些都没啥意义2.3 避免误导 包含List等关键字.字母o与数字0等2.4 做有意义的区分 反面教材,变量 ...

  2. jmeter非GUI模式命令

    一.如果没有.jtl文件,运行如下命令: jmeter -n -t baidu.jmx -l result.jtl 以非GUI形式运行Jmeter脚本jmeter -n -t baidu.jmx -l ...

  3. Centos 8双网卡设置

    原理:不管开发板是通过直连.路由器还是交换机连接到PC机,最终都是接到PC的以太网网卡(对笔记本来说,一般存在两个网卡,一个WIFI网卡和以太网网卡):因此要实现PC机与虚拟机的互ping,必须把虚拟 ...

  4. python -- 相对路径、绝对路径、以及路径的获取

    1.定义 绝对路径:就是文件的真正存在的路径,是指从硬盘的根目录(盘符)开始,进行一级级目录指向文件.   相对路径:就是以当前文件为基准进行一级级目录指向被引用的资源文件. ../ 表示当前文件所在 ...

  5. SpringBoot 上传文件突然报错 Failed to parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.1428942566812653608

    异常信息 org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request ...

  6. 119-PHP调用private成员的方法

    <?php class ren{ //定义人类 private $birthday='1990-12-20'; //定义private修饰的成员属性 public function say_bi ...

  7. Idea 打印GC

    设置 Run ⇒ Edit Configurations ⇒ VM options 添加 -XX:+PrintGCDetails 运行程序后会在末尾打印GC信息 2019-11-02 13:07:47 ...

  8. idea新建maven web项目

    一.新建maven web项目 二.配置服务器 三.测试运行

  9. JAVA程序中常用概念介绍

    一.关键字.引用.直接量.变量.长量概念 1.关键字 java内部定义的java语言专用的单词,这些单词具有特殊含义,开发人员在定义自己声明的名称时,应该避开这些专用的单词.这些专用的单词也就称之为j ...

  10. ROS2学习日志:TurtleSim测试日志(基于ROS2 Eloquent Elusor)

    TurtleSim测试日志(基于ROS2 Eloquent Elusor) 1.ros2 run 1.1 ros2 run turtlesim turtlesim_node --ros-args -- ...