AC自动机的裸题。学了kmp和Trie以后不难看懂。

有一些变化,比如0的定义和f的指向,和建立失配边,以及多了后缀连接数组last。没有试过把失配边直接当成普通边(一开始还是先这样写吧)。

#include<bits/stdc++.h>
using namespace std; const int maxlen = 1e6+, maxnds = *+, sigma_size = , maxsubs = ;
char str[maxlen]; #define idx(x) x-'a';
int last[maxnds];//后缀连接 为0表示空
int ch[maxnds][sigma_size];
int val[maxnds];
int nds;
char subs[maxsubs][];
int cnt[maxsubs+];
int f[maxnds]; void init() {
memset(ch,,sizeof(ch)); last[] = ; val[] = ; nds = ;
memset(cnt,,sizeof(cnt));
} void cal(int j)
{
while(j){
cnt[val[j]]++;
j = last[j];
}
} void Find(char *t)
{
for(int i = , j = ; t[i] ; i++){
int c = idx(t[i]);
while(j && !ch[j][c]) j = f[j];
j = ch[j][c];
if(val[j]) cal(j);
else if(last[j]) cal(last[j]);
}
} int getF()
{
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.size()){
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]];
}
}
} void add(char *s,int str_id)
{
int u = ;
for(int i = ; s[i]; i++){
int c = idx(s[i]);
if(!ch[u][c]){
memset(ch[nds],,sizeof(ch[nds]));
val[nds] = ;
ch[u][c] = nds++;
}
u = ch[u][c];
}
val[u] = str_id;
} int main()
{
//freopen("in.txt","r",stdin);
int n;
while(scanf("%d\n",&n),n){
init();
for(int i = ; i <= n; i++){
scanf("%s",subs[i]);
add(subs[i],i);
}
getF();
scanf("%s",str);
Find(str);
int best = *max_element(cnt+,cnt++n);
printf("%d\n",best);
for(int i = ; i <= n; i++){
if(cnt[i] == best) puts(subs[i]);
}
}
return ;
}

UVALive 4670 Dominating Patterns (AC自动机)的更多相关文章

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

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

  2. UVALive - 4670 Dominating Patterns AC 自动机

    input n 1<=n<=150 word1 word2 ... wordn 1<=len(wirdi)<=70 s 1<=len(s)<=1000000 out ...

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

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

  4. 【暑假】[实用数据结构]UVAlive 4670 Dominating Patterns

    UVAlive 4670 Dominating Patterns 题目:   Dominating Patterns   Time Limit: 3000MS   Memory Limit: Unkn ...

  5. uvalive 4670 Dominating Patterns

    在文本串中找出现次数最多的子串. 思路:AC自动机模板+修改一下print函数. #include<stdio.h> #include<math.h> #include< ...

  6. UVa1449 - Dominating Patterns(AC自动机)

    题目大意 给定n个由小写字母组成的字符串和一个文本串T,你的任务是找出那些字符串在文本中出现的次数最多 题解 一个文本串,多个模式串,这刚好是AC自动机处理的问题 代码: #include <i ...

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

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

  8. LA4670 Dominating Patterns AC自动机模板

    Dominating Patterns 每次看着别人的代码改成自己的模板都很头大...空间少了个0卡了好久 裸题,用比map + string更高效的vector代替蓝书中的处理方法 #include ...

  9. UVa Live 4670 Dominating Patterns - Aho-Corasick自动机

    题目传送门 快速的通道I 快速的通道II 题目大意 给定一堆短串,和一个文本串,问哪些短串在文本串中出现的次数最多. 我觉得刘汝佳的做法,时间复杂度有问题.只是似乎这道题短串串长太短不好卡.比如给出的 ...

随机推荐

  1. 转载TCP-IP协议解释

    本文转载自 http://www.ruanyifeng.com/blog/2009/03/tcp-ip_model.html TCP/IP模型是互联网的基础, 理解 TCP/IP对理解互联网至关重要 ...

  2. Spring Boot实现学生信息增删改查

    上一篇博客写了如何初始化一个简单的Spring Boot项目,这次详细记录一下如何连接数据库并实现增删改查基本操作. 我使用的是MySQL 5.5+Navicat,MySQL量级比较轻,当然微软的SQ ...

  3. 使用CTE生成辅助表(数字或时间)等

    数字辅助表: , ;WITH Digital_Rangs(Digital) AS ( SELECT @start_digital UNION ALL FROM [Digital_Rangs] WHER ...

  4. HDU 3410【单调栈】

    思路: 单调栈. 鄙人的记忆:按当前为最大值的两边延伸就是维护单调递减栈. //#include <bits/stdc++.h> #include <iostream> #in ...

  5. 洛谷P3668 [USACO17OPEN]Modern Art 2 现代艺术2

    P3668 [USACO17OPEN]Modern Art 2 现代艺术2 题目背景 小TY的同学HF也想创作艺术 HF只有一块长条状的画布(画条),所以每一次涂色只能涂上连续几个单位的颜料,同样新的 ...

  6. Ionic中基于js的扩展(指令和服务)来实现各种效果

    1.ion-header-bar ion-footer-bar ion-content align-title='left/ritght/center <body> <ion-hea ...

  7. NET Core 2.0 的 REST API

    用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 (2) + 准备项目 上一部分预备知识在这 http://www.cnblogs.com/cgzl/p/9010978 ...

  8. RTC-IC-PCF2129

    一特点: -20~70度,SPI/I2C接口,1.2 V to 4.2 V ,可编程看门狗,时钟输出以便校准,闹钟输出,时间戳输出.低功耗高精度,电源切换,中断输出. SPI接口和I2C接口硬件接法: ...

  9. docker安装软件

    镜像相关命令 1.搜索镜像 # docker search java 可使用 docker search命令搜索存放在 Docker Hub(这是docker官方提供的存放所有docker镜像软件的地 ...

  10. Spring Cloud 熔断器

    目录 Spring Cloud 熔断器 Hystrix ribbon中使用hystrix feign中使用hystrix Spring Cloud 熔断器 在微服务架构中,根据业务来拆分成一个个的服务 ...