题目传送门

题意:训练指南P216

分析:求出现最多次数的字串,那么对每个字串映射id,cnt记录次数求最大就可以了。

#include <bits/stdc++.h>
using namespace std; const int N = 150 + 5;
const int NODE = N * 70;
const int LEN = 1e6 + 5;
const int SIZE = 26;
struct AC {
int ch[NODE][SIZE], fail[NODE], val[NODE], cnt[N], sz;
map<string, int> ms;
void clear(void) {
memset (ch[0], 0, sizeof (ch[0]));
memset (cnt, 0, sizeof (cnt));
sz = 1; val[0] = 0;
ms.clear ();
}
int idx(char c) {
return c - 'a';
}
void insert(char *P, int id) {
ms[string (P)] = id;
int u = 0;
for (int c, i=0; P[i]; ++i) {
c = idx (P[i]);
if (!ch[u][c]) {
memset (ch[sz], 0, sizeof (ch[sz]));
val[sz] = 0; ch[u][c] = sz++;
}
u = ch[u][c];
}
val[u] = id;
}
void build(void) {
queue<int> que; fail[0] = -1;
int u;
for (int i=0; i<SIZE; ++i) {
u = ch[0][i];
if (u) {
fail[u] = 0; que.push (u);
}
}
while (!que.empty ()) {
u = que.front (); que.pop ();
for (int i=0; i<SIZE; ++i) {
int &v = ch[u][i];
if (!v) {
v = ch[fail[u]][i]; continue;
}
que.push (v);
fail[v] = ch[fail[u]][i];
}
}
}
void query(char *T) {
int u = 0, v;
for (int c, i=0; T[i]; ++i) {
c = idx (T[i]);
u = ch[u][c]; v = u;
cnt[val[v]]++;
}
}
}ac;
char pattern[N][75], text[LEN];
int n; void solve(void) {
int best = -1;
for (int i=1; i<=n; ++i) {
if (ac.cnt[i] > best) best = ac.cnt[i];
}
printf ("%d\n", best);
for (int i=1; i<=n; ++i) {
if (ac.cnt[ac.ms[string (pattern[i])]] == best) {
printf ("%s\n", pattern[i]);
}
}
} int main(void) {
while (scanf ("%d", &n) == 1) {
if (!n) break;
ac.clear ();
for (int i=1; i<=n; ++i) {
scanf ("%s", &pattern[i]);
ac.insert (pattern[i], i);
}
ac.build ();
scanf ("%s", &text);
ac.query (text);
solve ();
} return 0;
}

  

AC自动机 LA 4670 Dominating Patterns的更多相关文章

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

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

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

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

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

    题意:给定一个一篇文章,然后下面有一些单词,问这些单词在这文章中出现过几次. 析:这是一个AC自动机的裸板,最后在匹配完之后再统计数目就好. 代码如下: #pragma comment(linker, ...

  4. 【暑假】[实用数据结构]UVAlive 4670 Dominating Patterns

    UVAlive 4670 Dominating Patterns 题目:   Dominating Patterns   Time Limit: 3000MS   Memory Limit: Unkn ...

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

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

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

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

  7. uvalive 4670 Dominating Patterns

    在文本串中找出现次数最多的子串. 思路:AC自动机模板+修改一下print函数. #include<stdio.h> #include<math.h> #include< ...

  8. UVALive - 4670 Dominating Patterns AC 自动机

    input n 1<=n<=150 word1 word2 ... wordn 1<=len(wirdi)<=70 s 1<=len(s)<=1000000 out ...

  9. UVa Live 4670 Dominating Patterns - Aho-Corasick自动机

    题目传送门 快速的通道I 快速的通道II 题目大意 给定一堆短串,和一个文本串,问哪些短串在文本串中出现的次数最多. 我觉得刘汝佳的做法,时间复杂度有问题.只是似乎这道题短串串长太短不好卡.比如给出的 ...

随机推荐

  1. 词频统计_输入到文件_update

    /* 输入文件见337.in.txt 输出文件见338.out.txt */ #include <iostream> #include <cctype> #include &l ...

  2. Mysql游标

    14.6.6.1 Cursor CLOSE Syntax 14.6.6.2 Cursor DECLARE Syntax 14.6.6.3 Cursor FETCH Syntax 14.6.6.4 Cu ...

  3. sehll_if

    -s file 文件大小非0时为真 [ -f "somefile" ] :判断是否是一个文件[ -x "/bin/ls" ] :判断/bin/ls是否存在并有可 ...

  4. Struts2拦截器之ModelDrivenInterceptor

    叙述套路: 1.这是个啥东西,它是干嘛用的? 2.我知道它能干啥了,那它咋个用呢? 3.它能跑起来了,但是它是咋跑起来的是啥原理呢? 一.ModelDriven是个啥?他能做什么? 从前端页面到后端的 ...

  5. 让ASP.NET MVC不使用jsonp也可以跨域访问

    跨域问题仅仅发生在Javascript发起AJAX调用,或者Silverlight发起服务调用时,其根本原因是因为浏览器对于这两种请求,所给予的权限是较低的,通常只允许调用本域中的资源,除非目标服务器 ...

  6. golang channel basic

    package mainimport ( "fmt" "math/rand" "time")func main() { rand.Seed( ...

  7. Oracle【IT实验室】数据库备份与恢复之六:LogMiner

    6.1 LogMiner 的用途 Oracle LogMiner 是Oracle公司从产品8i以后提供的一个实际非常有用的分析工具,使用该工具可以轻松获得  Oracle 重作日志文件(归档日志文件) ...

  8. PHP商品秒杀计时实现(解决大流量方案)

    PHP商品秒杀功能我们多半以整点或时间点为例子,这样对于php来说处理不复杂,但有一个问题就是如果流量大要如何来处理,下面我们一起来看看解决办法. 要求要有小时分钟秒的实时倒计时的显示,用户端修改日期 ...

  9. php的时间输出格式

    php中时间一般分为两种格式,一种是标准时间格式timestamp,即Y-m-d G:i:s.另一种就是时间戳. 例如: 一.标准时间与时间戳转换: //获得服务端系统时间 date_default_ ...

  10. PHP json_encode中文乱码解决方法

    相信很多人在使用Ajax与后台php页面进行交互的时候都碰到过中文乱码的问题.JSON作为一种轻量级的数据交换格式,备受亲睐,但是用PHP作为后台交互,容易出现中文乱码的问题.JSON和js一样,对于 ...