题目链接https://vjudge.net/problem/UVA-1449

题目大意:给出N(N<150)个长度不超过L(70)的匹配串和一个长度小于1e6的文本串,在文本串中找出出现次数最多的匹配串,如果有多个匹配串满足条件,按输入顺序依次输出。

AC自动机复杂度约为O((N+M)*L) //N为匹配串个数,M为文本串长度,L为匹配串平均长度,时间3s,可行

用了两个map方便统计字符串出现的次数和根据节点编号找到对应的字符串,注意这里统计时不必将AC[u].cnt清零;

 #include<bits/stdc++.h>
using namespace std;
const int MAX_T=;
const int MAX_NOD=*+;
const int MAX_SIG=;
const int MAX_P=;
map<string,int> M;
map<int,string> _M;
char T[MAX_T];
struct node{
int next[MAX_SIG];
int fail,cnt;
};
struct aho
{
node AC[MAX_NOD];
int size; int idx(char c){return c-'a';} void init()
{
for(int i=;i<MAX_NOD;++i)
memset(AC[i].next,,sizeof(AC[i].next)),AC[i].cnt=;
size=;
AC[].fail=-;
} void insert(char *S)
{
int n=strlen(S);
int u=;
for(int i=;i<n;++i)
{
int c=idx(S[i]);
if(!AC[u].next[c]) AC[u].next[c]=size++;
u=AC[u].next[c];
}
AC[u].cnt++;
_M[u]=S;
//cout<<"---"<<_M[u]<<" "<<AC[u].cnt<<endl;
} void build_fail()
{
queue<int> q;
q.push();
AC[].fail=-;
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=;i<MAX_SIG;++i)
{
if(AC[u].next[i]){
if(!u) AC[AC[u].next[i]].fail=;
else{
int v=AC[u].fail;
while(v!=-&&AC[v].next[i]==) v=AC[v].fail;
if(v==-) AC[AC[u].next[i]].fail=;
else AC[AC[u].next[i]].fail=AC[v].next[i];
}
q.push(AC[u].next[i]);
}
}
}
} void cal(int u)
{
while(u!=-){//cout<<"ppp"<<endl;
M[_M[u]]+=AC[u].cnt;
// AC[u].cnt=0;
u=AC[u].fail;
}
} int solve(char *T)
{
int now=;
int n=strlen(T);
for(int i=;i<n;++i)
{
int c=idx(T[i]);
if(AC[now].next[c]) now=AC[now].next[c];
else{
int v=AC[now].fail;
while(v!=-&&AC[v].next[c]==) v=AC[v].fail;
if(v==-){now=;}
else{
now=AC[v].next[c];
}
}
if(AC[now].cnt){
cal(now);
}
}
}
};
int main()
{
int n;
char P[MAX_P];
string x[];
while(cin>>n&&n){
M.clear();
_M.clear();
aho a;
a.init();
for(int i=;i<=n;++i)
{
cin>>P;
x[i]=P;
M[P]=;
a.insert(P);
}
cin>>T;
a.build_fail();
int ans=;
a.solve(T);
for(int i=;i<=n;++i)
ans=max(ans,M[x[i]]);
cout<<ans<<endl;
for(int i=;i<=n;++i)
{
if(M[x[i]]==ans) cout<<x[i]<<endl;
}
}
return ;
}
/*
2
aba
bab
ababababac
6
beta
alpha
haha
delta
dede
tata
dedeltalphahahahototatalpha
0
*/

uva-1449-AC自动机的更多相关文章

  1. Uva 11468 AC自动机或运算

    AC自动机 UVa 11468 题意:给一些字符和各自出现的概率,在其中随机选择L次,形成长度为L的字符串S,给定K个模板串,求S不包含任意一个串的概率. 首先介绍改良版的AC自动机: 传统的AC自动 ...

  2. UVa 11468 (AC自动机 概率DP) Substring

    将K个模板串构成一个AC自动机,那些能匹配到的单词节点都称之为禁止节点. 然后问题就变成了在Tire树上走L步且不经过禁止节点的概率. 根据全概率公式用记忆化搜索求解. #include <cs ...

  3. UVA - 11468 (AC自动机+动态规划)

    建立AC自动机,把AC自动机当做一张图,在上面跑L个节点就行了. 参考了刘汝佳的代码,发现可能有一个潜在的Bug--如果模式串中出现了没有指定的字符,AC自动机可能会建立出错. 提供一组关于这个BUG ...

  4. Substring UVA - 11468 AC自动机+概率DP

    题意: 给出一些字符和各自对应的选择概率,随机选择L次后得到一个长度为L的随机字符串S. 给出K个模板串,计算S不包含任何一个模板串的概率 dp[i][j]表示走到AC自动机 i 这个节点 还需要走 ...

  5. UVA 11468 AC 自动机

    首先我们应该是枚举 L个位置上的每个字符来得到最终概率 然后AC自动机的作用就是为了判断你枚举的地方是否对应了单词节点,如果对应了,就肯定要不得 #include <iostream> # ...

  6. UVa 11019 (AC自动机 二维模式串匹配) Matrix Matcher

    就向书上说得那样,如果模式串P的第i行出现在文本串T的第r行第c列,则cnt[r-i][c]++; 还有个很棘手的问题就是模式串中可能会有相同的串,所以用repr[i]来记录第i个模式串P[i]第一次 ...

  7. UVA 11468 AC自动机入门题 记忆化概率dp+ac自动机

    /** 链接:https://vjudge.net/problem/UVA-11468 详见lrj训练指南P218 我的是反向求存在模板串的概率. dp[i][j]表示当前i位置选择字符,前面i-1个 ...

  8. uva 11468 AC自动机+概率DP

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

  9. UVa 1449 - Dominating Patterns (AC自动机)

    题目大意:给出多个字符串模板,并给出一个文本串,求在文本串中出现最多的模板,输出最多的次数并输出该模板(若有多个满足,则按输入顺序输出). 思路:赤裸裸的 AC自动机,上模板. 代码: #includ ...

  10. UVA 11019 Matrix Matcher(ac自动机)

    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

随机推荐

  1. 面试题15:链表中倒数第K个结点

    输入一个链表,输出该链表中倒数第k个结点. 方法1: 这个解法要循环两次链表 /* public class ListNode { int val; ListNode next = null; Lis ...

  2. elastic search 查询语句

    部署了半个月,分析一下数据: 需要提前知道的是,tpot中,每天的数据存一个index,然后每个index里面有不同的type,每条请求一个document 共24万条请求: 查看整个集群所有数据 以 ...

  3. vue事件修饰器

    事件修饰器 Vue.js 为 v-on 提供了 事件修饰符.通过由点(.)表示的指令后缀来调用修饰符.· .stop .prevent .capture .self <div id=" ...

  4. 在VMW里安装Ghost操作系统遇到的问题及解决的办法

    条件:Ghost系列系统镜像文件 遇到的问题:1.导入镜像文件时提示“无法检测此光盘映像中的操作系统”: 2.分区时提示“ezboot kernel not found” 解决办法:1.直接先创建一个 ...

  5. django--博客--forms组件-用户注册

    ---------------------------------------------前端页面简易代码----------------------------------------------- ...

  6. django自定义模板和过滤器

    -自定义过滤器 -1 先app是不是已经在setting中注册 -2 在app下创建一个templatetags(****名字不能变***)的文件夹(模块) -3 在模块下创建一个py文件,名字随意: ...

  7. django中的setting全局变量的导入

    需求:在py文件中导入settings.py中的变量BASE_DIR settings.py文件 import os # Build paths inside the project like thi ...

  8. composer 常用包管理工具

    名称 用途说明 说明地址 mashape/unirest-php 简单易用的HTTP请求库 官网地址 guzzlehttp/guzzle 功能强大的HTTP请求库 文档 hassankhan/conf ...

  9. tarball源码安装

    软件最原始的安装方法 用tarball来安装升级make命令执行make ,会在当前路径下搜索makefile这个文本文件,这个文件中记录了源码如何编译的详细信息.软件开发商通常会写一个检测程序,检测 ...

  10. Python HTML Resolution Demo - SGMLParser & PyQuery

    1. SGMLParser: 这里定义了一个Parse类,继承SGMLParser里面的方法.使用一个变量is_h4做标记判定html文件中的h4标签,如果遇到h4标签,则将标签内的内容加入到Pars ...