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自动机,每个节点 ...
随机推荐
- 033、Java中使用简化运算符
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- 016.CI4框架CodeIgniter数据库操作之:Insert插入一条数据
01.在Model中,写入插入的语句 <?php namespace App\Models\System; use CodeIgniter\Model; class User_model ext ...
- 微信群API接口
安卓微信的api,个人微信开发API协议,微信 ipad sdk,微信ipad协议,微信web版接口api,微信网页版接口,微信电脑版sdk,微信开发sdk,微信开发API,微信协议,微信接口文档sd ...
- mjpg-streamer视频服务器移植
相关软件下载地址:http://pan.baidu.com/s/16yo8Y JPEG库的移植 对于内核linux-2.6.35,不能再使用servfox,如果要使用的需要修改大量的代码.在此选用新的 ...
- Win10下用selenium、Image.crop() 截图时、坐标不准确的问题
截百度按钮的图 先将整个窗口的图保存下来 from selenium import webdriver driver = webdriver.Chrome() driver.get('https:// ...
- POJ 1770 树形DP
咋一看确实想到的是树形DP,但是我一开始也马上想到环的情况,这样应该是不可以进行树形DP的,然后我自以为是地想用有向图代替无向图,而且总是从能量高的指向能量低的,这样自以为消除了环,但是其实是不对滴, ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 数字
下面是一个 C++ 中定义各种类型数字的综合实例: #include <iostream> using namespace std; int main () { // 数字定义 short ...
- Sklearn K均值聚类
## 版权所有,转帖注明出处 章节 SciKit-Learn 加载数据集 SciKit-Learn 数据集基本信息 SciKit-Learn 使用matplotlib可视化数据 SciKit-Lear ...
- webpack散记---提取公共代码
(1)作用: 减少代码冗余 提高加载速度 (2)来源 commonsChunkPlugin webpack.optimize.CommonsChunkPlugin (3)配置 { plugins:[ ...
- sprngmvc+restFul 请求报错:404
服务端代码 control类 @RequestMapping(value="getUser",method = RequestMethod.POST) @ResponseBody ...