UVALive-4670 Dominating Patterns / 洛谷 3796 【模板】AC自动机
https://vjudge.net/problem/UVALive-4670
中文题面:https://www.luogu.org/problem/show?pid=3796
AC自动机模板
注意如果有重复字符串,要输出所有的重复字符串
可以用重复字符串中标号最小的字符串来表示所有的重复字符串
例:
aba
abba
aba
aba出现了2次,
令mp[1]=mp[3]=1
代码实现的话,只需要在insert的最后判断,
如果这个单词节点还没有标记,标记上这个单词的编号
如果有标记,令当前单词的mp等于单词节点的标记
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std; char s[],ss[][];
int sum[],bl[*];
int trie[*][],tot;
int len,root,id;
int f[*];
int mp[];
queue<int>q; struct AhoCorasickAutomata
{
void insert(int j)
{
len=strlen(ss[j]);
root=;
for(int i=;i<len;i++)
{
id=ss[j][i]-'a';
if(!trie[root][id])
{
trie[root][id]=++tot;
bl[tot]=;
memset(trie[tot],,sizeof(trie[tot]));
}
root=trie[root][id];
}
if(!bl[root]) bl[root]=j;
mp[j]=bl[root];
}
void getfail()
{
memset(f,,sizeof(f));
for(int i=;i<;i++) trie[][i]=;
q.push();
int now,j;
while(!q.empty())
{
now=q.front();q.pop();
for(int i=;i<;i++)
{
if(!trie[now][i]) continue;
q.push(trie[now][i]);
j=f[now];
while(!trie[j][i]) j=f[j];
f[trie[now][i]]=trie[j][i];
}
}
}
void find()
{
len=strlen(s);
memset(sum,,sizeof(sum));
root=; int j;
for(int i=;i<len;i++)
{
id=s[i]-'a';
while(!trie[root][id]) root=f[root];
root=trie[root][id];
j=root;
while(j)
{
sum[bl[j]]++;
j=f[j];
}
}
}
}; AhoCorasickAutomata AC; int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(!n) return ;
tot=;
memset(trie[],,sizeof(trie[]));
memset(mp,,sizeof(mp));
for(int i=;i<=n;i++)
{
scanf("%s",ss[i]);
AC.insert(i);
}
AC.getfail();
scanf("%s",s);
AC.find();
int maxn=;
for(int i=;i<=n;i++) maxn=max(maxn,sum[i]);
printf("%d\n",maxn);
for(int i=;i<=n;i++)
if(sum[mp[i]]==maxn) puts(ss[i]);
}
}
UVALive-4670 Dominating Patterns / 洛谷 3796 【模板】AC自动机的更多相关文章
- 【暑假】[实用数据结构]UVAlive 4670 Dominating Patterns
UVAlive 4670 Dominating Patterns 题目: Dominating Patterns Time Limit: 3000MS Memory Limit: Unkn ...
- UVALive 4670 Dominating Patterns --AC自动机第一题
题意:多个模板串,一个文本串,求出那些模板串在文本串中出现次数最多. 解法:AC自动机入门模板题. 代码: #include <iostream> #include <cstdio& ...
- uvalive 4670 Dominating Patterns
在文本串中找出现次数最多的子串. 思路:AC自动机模板+修改一下print函数. #include<stdio.h> #include<math.h> #include< ...
- UVALive - 4670 Dominating Patterns AC 自动机
input n 1<=n<=150 word1 word2 ... wordn 1<=len(wirdi)<=70 s 1<=len(s)<=1000000 out ...
- 洛谷.3808/3796.[模板]AC自动机
题目链接:简单版,增强版 简单版: #include <cstdio> #include <cstring> const int N=1e6+5,S=26; char s[N] ...
- UVALive 4670 Dominating Patterns (AC自动机)
AC自动机的裸题.学了kmp和Trie以后不难看懂. 有一些变化,比如0的定义和f的指向,和建立失配边,以及多了后缀连接数组last.没有试过把失配边直接当成普通边(一开始还是先这样写吧). #inc ...
- 洛谷 P3804 [模板] 后缀自动机
题目:https://www.luogu.org/problemnew/show/P3804 模仿了一篇题解,感觉很好写啊. 代码如下: #include<cstdio> #include ...
- 洛谷P3808 & P3796 AC自动机模板
题目:P3808:https://www.luogu.org/problemnew/show/P3808 P3796:https://www.luogu.org/problemnew/show/P37 ...
- 洛谷.3121.审查(AC自动机 链表)
题目链接 //删掉一个单词需要前移一段位置,用链表维护就好了 复杂度O(sum(len)) #include <cstdio> #include <cstring> #defi ...
随机推荐
- net::ERR_ABORTED ,引入js文件出现报错的解决方法
在head头里面添加 <mvc:annotation-driven enable-matrix-variables="true"></mvc:annotation ...
- Daily Scrum 10
今天我们小组开会内容分为以下部分: part 1: 经过反复思考,对于上次组会确定的在系统中加入娱乐版块进行了更进一步的商讨; part 2:继续探讨算法实现: part 3:进行明日的任务分配; ◆ ...
- 软件工程课堂作业(十一)——NABC分析
一.团队开发项目:基于Android的重力感应的解锁APP 二.项目特点:区别于一般解锁软件用开机按钮开锁解锁,我们的重力解锁软件根据动作实现解锁,减少了开机按钮的使用频率,提高寿命. 三.NABC分 ...
- object-oriented第二次作业(1)
1001.A+B F Format(20) 我的代码 题目看完,感觉挺简单的,就直接开始写代码了. 我把加起来后的数字的每位数用数组存起来,特判一下0和负数的情况,然后再一位位输出,遇到该输逗号的时候 ...
- <Android>列表、网格、画廊视图及适配器的绑定
列表视图和适配器的绑定 列表视图既可以使用ListView组件,也可以继承ListActivity.显示可以是ArrayAdapter,也可以是游标SimpleCursorAdapter,还可以是继承 ...
- udp->ip & tcp->ip 发送数据包的目的地址的源地址是什么时候确定的?
udp->ip & tcp->ip udp到ip层是:ip_send_skb tcp到ip层是: ip_queue_xmit 拿tcp为例,在使用[ip_queue_xmit, i ...
- React & event-pooling & bug
React & event-pooling & bug event-pooling https://reactjs.org/docs/events.html#event-pooling ...
- nargchk函数 matlab【转】
功能说明 验证输入参数的个数 函数语法 msgstring = nargchk(minargs, maxargs, numargs)msgstring = nargchk(minargs, max ...
- set类型没有单独取值功能 通过循环取值
set类型没有单独取值功能 通过循环取值
- excel 列索引(数字)转列名
function index2ColName($columnNumber) { $dividend = $columnNumber; while ($dividend > 0) { $modul ...