UVALive 4670 AC自动机
第二道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自动机的更多相关文章
- LA 4670 (AC自动机 模板题) Dominating Patterns
AC自动机大名叫Aho-Corasick Automata,不知道的还以为是能自动AC的呢,虽然它确实能帮你AC一些题目.=_=|| AC自动机看了好几天了,作用就是多个模式串在文本串上的匹配. 因为 ...
- LA 4670 AC自动机
题意:给一个字典,看这个字典中匹配最多次数的是哪个单词(可以有多个). 分析: AC自动机就是用来解决多模式匹配问题的工具. 模板用的lrj的,相比HDU 2222,动态开辟字典树.用last数组统计 ...
- La 4670 AC自动机(模版)
#include<iostream> #include<cstring> #include<queue> #include<cstdio> #inclu ...
- UVALive 4670 Dominating Patterns --AC自动机第一题
题意:多个模板串,一个文本串,求出那些模板串在文本串中出现次数最多. 解法:AC自动机入门模板题. 代码: #include <iostream> #include <cstdio& ...
- UVALive 4670 Dominating Patterns (AC自动机)
AC自动机的裸题.学了kmp和Trie以后不难看懂. 有一些变化,比如0的定义和f的指向,和建立失配边,以及多了后缀连接数组last.没有试过把失配边直接当成普通边(一开始还是先这样写吧). #inc ...
- 沉迷AC自动机无法自拔之:[UVALive 4126] Password Suspects
图片加载可能有点慢,请跳过题面先看题解,谢谢 一看到这么多模式串就非常兴奋,又是\(AC\)自动机 题目就是要求:经过 \(n\) 个节点,把所有单词都遍历一遍的方案数,和那道题差不多嘛 所以这样设: ...
- LA 4670 Dominating Patterns (AC自动机)
题意:给定n个字符串和一个文本串,查找哪个字符串出现的次数的最多. 析:一匹配多,很明显是AC自动机.只需要对原来的进行修改一下,就可以得到这个题的答案, 计算过程中,要更新次数,并且要映射字符串.如 ...
- UVALive - 3490 Generator (AC自动机+高斯消元dp)
初始有一个空串s,从前n个大写字母中不断随机取出一个字母添加到s的结尾,出现模式串t时停止,求停止时s的长度期望. 这道题解法不唯一,比较无脑的方法是对模式串t建一个单串AC自动机,设u为自动机上的一 ...
- UVALive - 4126 Password Suspects (AC自动机+状压dp)
给你m个字符串,让你构造一个字符串,包含所有的m个子串,问有多少种构造方法.如果答案不超过42,则按字典序输出所有可行解. 由于m很小,所以可以考虑状压. 首先对全部m个子串构造出AC自动机,每个节点 ...
随机推荐
- 035、Java中自增之++在后面的写法
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- 初识python 廖雪峰(慕课网)
3-9 Python中的布尔类型 短路计算 True和False是布尔值,就像1,2,3是整数,“abc”是字符串一样. 做这个题,需要了解以下两点: 第一,在一个语句中,当and和or同时存在时,a ...
- 2.10 学习总结 之 JQ加强
一.说在前面 昨天 完成了体温统计APP的编写 今天 学习json数据结构 二.学习总结 1.json数据结构 1)什么是json: JSON(JavaScript Object Notation) ...
- NetWork--记一次Http和TLS抓包
参考 前言 工具 wireshark IP 发送方IP: 150.236.224.39 服务IP: 10.210.164.20 消息 Http,Https消息使用org.apache.http.cli ...
- Java8集合框架——HashSet源码分析
本文的目录结构: 一.HashSet 的 Javadoc 文档注释和简要说明 二.HashSet 的内部实现:内部属性和构造函数 三.HashSet 的 add 操作和扩容 四.HashSet 的 r ...
- jquery快速常用技能
jQuery入口函数与js入口函数 (window.onload = function(){})的对比: 1.JavaScript的入口函数要等到页面中所有资源(包括图片.文件)加载完成才开始执行. ...
- Django--评论功能实现和用户登录
1.确定实现评论功能的方式 1.第三方社会化评论插件(有言.多说.网易云跟帖等) 优点:可以直接用,紧急时开发快 缺点:评论存储在第三方,第三方挂了就不弄用 2.Django评论库 django-co ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 文件和流
如何从文件读取流和向文件写入流.这就需要用到 C++ 中另一个标准库 fstream,它定义了三个新的数据类型: ofstream 该数据类型表示输出文件流,用于创建文件并向文件写入信息. ifstr ...
- Python MySQL Join
章节 Python MySQL 入门 Python MySQL 创建数据库 Python MySQL 创建表 Python MySQL 插入表 Python MySQL Select Python M ...
- Elasticsearch 使用集群
章节 Elasticsearch 基本概念 Elasticsearch 安装 Elasticsearch 使用集群 Elasticsearch 健康检查 Elasticsearch 列出索引 Elas ...