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& ...
随机推荐
- celery中的生产者消费者问题
celery中的生产者消费者问题 在task1.py文件中: # demo1:task.py and celery.py in one file# run it byfrom celery impor ...
- If 条件控制 & while循环语句
Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. 可以通过下图来简单了解条件语句的执行过程: if 语句 Python中if语句的一般形式如下所示: i ...
- subprocess 模块 与终端相互交互
import subprocess ''' sh-3.2# ls /Users/egon/Desktop |grep txt$ mysql.txt tt.txt 事物.txt ''' #1 Linux ...
- (4.6)sql2008中的group by grouping sets
最近遇到一个情况,需要在内网系统中出一个统计报表.需要根据不同条件使用多个group by语句.需要将所有聚合的数据进行UNION操作来完成不同维度的统计查看. 直到发现在SQL SERVER 200 ...
- DBCC SHRINKFILE收缩日志/收缩数据库/收缩文件
DBCC SHRINKFILE 收缩相关数据库的指定数据文件或日志文件大小. 语法 DBCC SHRINKFILE ( { file_name | file_id } { [ ,t ...
- python 自动获取(打印)代码中的变量的名字字串
方法一: import inspectimport re def varname(p): for line in inspect.getframeinfo(inspect.currentframe() ...
- Hadoop集群的配置的主机和IP
集群配置如下: hadoop 192.168.80.100 hadoop1 192.168.80.101 hadoop2 192.168.80.102 (注:ha ...
- rsync+sersync多线程实时同步
一.sersync优点 1)使用c++编写,对linux系统文件产生的临时文件和重复文件操作会进行过滤,在结合rsync同步的时候,会减少运行时消耗的本地及网络资源,因此速度更快. 2)相比较inot ...
- SharePoint 2010 以Jquery Ajax方式更新SharePoint列表数据!
之前本人的博客介绍了<sharepoint 2010自定义访问日志列表设置移动终端否和客户端访问系统等计算列的公式>,那如何通过Jquery提交访问日志到自定义的SharePoint的访问 ...
- shiro 拦截器
参考