题意:给一个字典,看这个字典中匹配最多次数的是哪个单词(可以有多个)。

分析:

  • AC自动机就是用来解决多模式匹配问题的工具。
  • 模板用的lrj的,相比HDU 2222,动态开辟字典树。用last数组统计字典。
  • 统计每一个单词匹配的次数cnt[],下标唯一对应val,最后遍历一遍cnt。
#include <bits/stdc++.h>

using namespace std;

const int SIGMA_SIZE = ;
const int MAXNODE = ;
const int MAXS = +; map<string,int> ms; struct Aho {
int ch[MAXNODE][SIGMA_SIZE];
int f[MAXNODE];
int last[MAXNODE];
int cnt[MAXS];
int val[MAXNODE];
int sz; void init() {
sz = ;
memset(ch[],,sizeof(ch[]));
memset(cnt,,sizeof(cnt));
ms.clear();
} int idx(char c) {
return c - 'a';
} void insert(char *s,int v) {
int u = ,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;
ms[string(s)] = v;
} void getFail() {
queue<int> q;
f[] = ; for(int c = ; c < SIGMA_SIZE; c++) {
int u = ch[][c];
if(u) {
f[u] = ;
q.push(u);
last[u] = ;
}
} while(!q.empty()) { //失配是一个宽搜的过程
int r = q.front();q.pop();
for(int c = ; c < SIGMA_SIZE; 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]]; //last 方便统计
}
} } void find(char* T) {
int n = strlen(T);
int j = ; 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 print(int j) {
if(j) {
cnt[val[j]]++;
print(last[j]);
}
} }aho; int n,T; char text[],P[][]; int main(int argc, char const *argv[])
{
while(scanf("%d",&n),n) {
aho.init(); for(int i=; i <= n; i++) {
scanf("%s",P[i]);
aho.insert(P[i],i);
} aho.getFail(); scanf("%s",text);
aho.find(text); int ans = -;
for(int i=; i <= n; i++)
if(aho.cnt[i]>ans) ans = aho.cnt[i]; printf("%d\n",ans); for(int i=; i <= n; i++)
if(aho.cnt[i]==ans)
printf("%s\n",P[i]);
}
return ;
}

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

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

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

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

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

  3. UVALive 4670 AC自动机

    第二道AC自动机的题目了,之前参考的是网上一个博客算法,不怎么好,难写而且占空间 后来参照大白书做的这题,代码简洁多了 #include <iostream> #include <c ...

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

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

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

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

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

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

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

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

  8. hdu----1686 Oulipo (ac自动机)

    Oulipo Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  9. LA_4670_Dominating_Patterns_(AC自动机+map)

    描述 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...

随机推荐

  1. vue2.0 在main.js引入scss文件报错

    在vue2.0的main.js中引入scss文件报错 原因是在 在build文件夹下的webpack.base.conf.js的rules里面添加配置 { test: /\.scss$/, loade ...

  2. 使用Redis 配置替换fastjson 反序列化报错 com.alibaba.fastjson.JSONException: autoType is not support

    新建的GenericFastJson2JsonRedisSerializer里面添加白名 添加: static {        ParserConfig.getGlobalInstance().ad ...

  3. svn checkout时连接不到服务器,重装也没有弹出用户名和密码输入框的问题

    用公司的电脑,是win7 64位的系统,可以checkout出东西.现在用自己的电脑上,系统是win7 64位的,却再也连不上SVN. 1.不提示输入用户名和密码,不管重装多少次都一样. 2.Tort ...

  4. centOS查看apache版本的命令

    在centOS 7下: 命令如下: httpd -v

  5. [Activator-HelloAkka] Create our Actors

    So far we have defined our Actor and its messages. Now let's create an instance of this actor. In Ak ...

  6. 迪米特法則 Law of Demeter

    又稱為"最小知識"原則, 若對Law of Demeter做一個簡單總結: 任何對象的任何方法只能調用以下對象中的方法: (1) 該對象本身 (2) 所傳入的參數對象 (3) 它所 ...

  7. 遇见phpDesigner我笑了 PHP开发利器

    phpDesigner实在太好用了 相信许多PHP同胞谈到PHP开发工具的时候,都会想到Zend Studio.Eclipse等开发工具,这些工具的确非常的强大强悍,但复杂的配置满屏幕的英文并不适合所 ...

  8. 【Openvpn】iOS OpenVPN客户端设置指南(适用iPhone/iPad)

    适用于iPhone/iPad/这些iOS设备.之前iOS使用OpenVPN是需要越狱的,并且是付费第三方应用. 去年开始OpenVPN官方推出了iOS客户端就好用多了,免费也无需越狱. 说明:如果是新 ...

  9. [转]Session and application state in ASP.NET Core

    本文转自:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/app-state By Rick Anderson and Steve ...

  10. 【JavaWeb】JSP九大内置对象

    内置对象特点: 1.            由JSP规范提供,不用编写者实例化. 2.            通过Web容器实现和管理 3.            所有JSP页面均可使用 4.     ...