题目传送门

题意:训练指南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. Qt 获取Mac地址

    QList<QNetworkInterface> list = QNetworkInterface::allInterfaces(); foreach(QNetworkInterface ...

  2. iOS中UITableView的一些设置

    不可滑动: ? 1 tableView.userInteractionEnabled = NO; 也可以在storyboard中的userInteractionEnable属性设置 显示导向箭头: ? ...

  3. LinkIssue: Error 'LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or cor

    参考:http://blog.csdn.net/junjiehe/article/details/16888197 使用VisualStudio 编译链接中可能出现如下错误: LINK : fatal ...

  4. Qt5_简易画板_详细注释

    代码下载链接:  http://pan.baidu.com/s/1hsc41Ek 密码: 5hdg 显示效果如下: 代码附有详细注释(代码如下) /*** * 先新建QMainWindow, 项目名称 ...

  5. SQL存储过程大全

    --增加 create proc usp_insertToText ), ), @usitPrice decimal as begin insert into TEST1 output inserte ...

  6. JS函数的其他用法【备于取用】

    //随机数生成器 Math.random()   日期时间函数(需要用变量调用): var b = new Date(); //获取当前时间 b.getTime() //获取时间戳 b.getFull ...

  7. 51nod1066(bash博弈)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1066 题意:中文题诶- 思路:感觉博弈全靠yy- 在双方都没有 ...

  8. 数据结构之Dijkstra算法

    基本思想 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算). 此外,引进两个集合S和U.S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求 ...

  9. cutpFTP设置步骤

    cutpFTP设置步骤 平常时为了方便两台电脑之间传送数据,我们可以使用cutpftp这个工具实现,而且cutpftp还具有定时传送的功能,非常方便使用.以下是使用该工具的“同步文件夹”功能同步两台电 ...

  10. .net学习之泛型、程序集和反射

    一.泛型1.CLR编译时,编译器只为MyList<T>类型产生“泛型版”的IL代码——并不进行泛型的实例化,T在中间只充当占位符.例如:MyList 类型元数据中显示的<T> ...