uva-1449-AC自动机
题目链接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自动机的更多相关文章
- Uva 11468 AC自动机或运算
AC自动机 UVa 11468 题意:给一些字符和各自出现的概率,在其中随机选择L次,形成长度为L的字符串S,给定K个模板串,求S不包含任意一个串的概率. 首先介绍改良版的AC自动机: 传统的AC自动 ...
- UVa 11468 (AC自动机 概率DP) Substring
将K个模板串构成一个AC自动机,那些能匹配到的单词节点都称之为禁止节点. 然后问题就变成了在Tire树上走L步且不经过禁止节点的概率. 根据全概率公式用记忆化搜索求解. #include <cs ...
- UVA - 11468 (AC自动机+动态规划)
建立AC自动机,把AC自动机当做一张图,在上面跑L个节点就行了. 参考了刘汝佳的代码,发现可能有一个潜在的Bug--如果模式串中出现了没有指定的字符,AC自动机可能会建立出错. 提供一组关于这个BUG ...
- Substring UVA - 11468 AC自动机+概率DP
题意: 给出一些字符和各自对应的选择概率,随机选择L次后得到一个长度为L的随机字符串S. 给出K个模板串,计算S不包含任何一个模板串的概率 dp[i][j]表示走到AC自动机 i 这个节点 还需要走 ...
- UVA 11468 AC 自动机
首先我们应该是枚举 L个位置上的每个字符来得到最终概率 然后AC自动机的作用就是为了判断你枚举的地方是否对应了单词节点,如果对应了,就肯定要不得 #include <iostream> # ...
- UVa 11019 (AC自动机 二维模式串匹配) Matrix Matcher
就向书上说得那样,如果模式串P的第i行出现在文本串T的第r行第c列,则cnt[r-i][c]++; 还有个很棘手的问题就是模式串中可能会有相同的串,所以用repr[i]来记录第i个模式串P[i]第一次 ...
- UVA 11468 AC自动机入门题 记忆化概率dp+ac自动机
/** 链接:https://vjudge.net/problem/UVA-11468 详见lrj训练指南P218 我的是反向求存在模板串的概率. dp[i][j]表示当前i位置选择字符,前面i-1个 ...
- uva 11468 AC自动机+概率DP
#include<cstdio> #include<cstring> #include<queue> #include<cstdio> #include ...
- UVa 1449 - Dominating Patterns (AC自动机)
题目大意:给出多个字符串模板,并给出一个文本串,求在文本串中出现最多的模板,输出最多的次数并输出该模板(若有多个满足,则按输入顺序输出). 思路:赤裸裸的 AC自动机,上模板. 代码: #includ ...
- UVA 11019 Matrix Matcher(ac自动机)
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
随机推荐
- 东方通tongweb linux安装
1.把安装的bin文件和license.dat文件放到/opt目录下 2.运行$sh Install_TW5.0.0.0_Standard_Linux.bin -i console 命令在 Linux ...
- ssh登陆github
ssh [转载] 如果只是在一个仓库里管理文件历史,Git和SVN真没啥区别.为了保证你现在所学的Git物超所值,将来绝对不会后悔,同时为了打击已经不幸学了SVN的童鞋,本章开始介绍Git的杀手级功能 ...
- 报错:SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
Outline SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: trunc ...
- python s13 day04
1.1 all() 和 any( ) all() any() 0,None,"", [], (),{} #布尔值为0的 列举,None ,空列表,空元祖,空. print( ...
- Cpython-并发编程
阅读目录 一 背景知识 二 python并发编程之多进程 三 python并发编程之多线程 四 python并发编程之协程 五 python并发编程之IO模型 六 补充:paramiko模块 七 作业 ...
- ThinkPHP框架之模型
一.数据库配置 在父类配置ThinkPHP/Conf/convention.php中,找到数据库设置部分: 将这部分复制到我们模块的配置文件Home/Conf/config.php中,将需要的参数写上 ...
- 筛选最新生成的报告——sort
筛选出最新报告发送,返回报告路径 import os def filePath(path): return os.path.join(os.path.abspath(os.path.dirname(o ...
- Unity 碰撞检测 OnTriggerEnter 入门
当我们需要检测两个物体A和B发生碰撞的时候,必须要满足一下条件 1:A和B必须有碰撞边界,你可以点开一个A,在属性窗口点击AddComponent,在physis(物理)目录下看到以下这些 ,根据形状 ...
- return false 和 return true
常规用法 在普通函数中:return 语句终止函数的执行,并返回一个指定的值给函数调用者,一般会用一个变量接收这个返回值再进行其它处理.如果未指定返回值,则返回 undefined 其中,返回一个函数 ...
- 【笔记】Maven使用入门
参考<maven实战> 1.编写POM 2.编写主代码 3.编写测试代码 4.打包和运行 具体如下: 1.编写POM. <!-- XML头,指定了该xml文档的版本和编辑方式 --& ...