1036 : Trie图 (AC自动机)
题目大意: 输入 n 个目标单词和一个文本串,判断文本串中是否存在某些目标单词。
思路 赤裸裸的 AC自动机。
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
#define INF 0x7fffffff
int ch[1000010][26],f[1000010],last[1000010],val[1000010],nz,found;
char s[1000000],T[1000010];
void insert(){
int i,j,u = 0,len = strlen(s);
for(i=0; i<len; i++){
int v = s[i] - 'a';
if(!ch[u][v]){
memset(ch[nz],0,sizeof(ch[nz]));
val[nz] = 0;
ch[u][v] = nz ++;
}
u = ch[u][v];
val[u] = 0;
}
val[u] = 1;
}
void getFail(){
int i,j,n;
queue<int> Q;
while(!Q.empty())
Q.pop();
f[0] = 0;
for(int c =0; c<26; c++){
int u = ch[0][c];
if(u){
f[u] = 0;
last[u] = 0;
Q.push(u);
}
}
while(!Q.empty()){
int r = Q.front();
Q.pop();
for(int c=0; c<26; 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 find(){
int i,j,len = strlen(T),u = 0;
for(i=0; i<len; i++){
int v = T[i] - 'a';
while(u && !ch[u][v]) u = f[u];
u = ch[u][v];
if(val[u]){
found = 1;
return ;
}
else if(last[u]){
found = 1;
return ;
}
}
}
int main(){
int i,n;
while(scanf("%d",&n) == 1){
found = 0;
memset(val,0,sizeof(val));
memset(ch[0],0,sizeof(ch[0]));
nz = 1;
for(i=0;i<n;i++){
scanf("%s",s);
insert();
}
scanf("%s",T);
getFail();
find();
if(!found)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}
1036 : Trie图 (AC自动机)的更多相关文章
- hihoCoder 1036 Trie图 AC自动机
题意:给定n个模式串和一个文本串,判断文本中是否存在模式串. 思路:套模板即可. AC代码 #include <cstdio> #include <cmath> #includ ...
- BZOJ 1444 [JSOI2009]有趣的游戏 (Trie图/AC自动机+矩阵求逆)
题目大意:给你$N$个长度相等且互不相同的模式串,现在有一个字符串生成器会不断生成字符,其中每个字符出现的概率是$p_{i}/q_{i}$,当生成器生成的字符串包含了某个模式串,则拥有该模式串的玩家胜 ...
- BZOJ 3530 [SDOI2014]数数 (Trie图/AC自动机+数位DP)
题目大意:略 裸的AC自动机+数位DP吧... 定义f[i][x][0/1]表示已经匹配到了第i位,当前位置是x,0表示没到上限,1到上限,此时数是数量 然而会出现虚拟前导零,即前几位没有数字的情况, ...
- 关于Trie KMP AC自动机
个人认为trie,KMP,AC自动机是思想非常明确的,AC自动机的性质是与KMP算法的思想类似的(失配后跳转) 而KMP是线性的,AC自动机是在tire树上跑KMP,为方便那些不会用指针的小朋友(我也 ...
- 2021.11.09 P2292 [HNOI2004]L语言(trie树+AC自动机)
2021.11.09 P2292 [HNOI2004]L语言(trie树+AC自动机) https://www.luogu.com.cn/problem/P2292 题意: 标点符号的出现晚于文字的出 ...
- 【hihoCoder】1036 Trie图
题目:http://hihocoder.com/problemset/problem/1036 给一个词典dict,词典中包含了一些单词words.要求判断给定的一个文本串text中是否包含这个字典中 ...
- hihoCoder#1036 Trie图
原题地址 看了这篇博文,总算是把Trie图弄明白了 Runtime Error了无数次,一直不知道为什么,于是写了个脚本生成了一组大数据,发现果然段错误了. 调试了一下午,总算闹明白了,为什么呢? 1 ...
- CF1110H Modest Substrings AC自动机、DP
传送门 如果\(r-l\)比较小,可以将所有满足条件的串扔进\(AC\)自动机然后在上面DP,从前往后确定字符串的每一位. 但是\(l,r \leq 10^{800}\)就十分不可行,所以需要优化这个 ...
- HDU 3341 Lost's revenge ( Trie图 && 状压DP && 数量限制类型 )
题意 : 给出 n 个模式串,最后给出一个主串,问你主串打乱重组的情况下,最多能够包含多少个模式串. 分析 : 如果你做过类似 Trie图 || AC自动机 + DP 类似的题目的话,那么这道题相对之 ...
随机推荐
- Android(java)学习笔记231:服务(service)之混合方式开启服务
1. 前面我们已经讲过可以使用两种方式开启服务 startService----stopService: oncreate() ---> onstartCommand() ---& ...
- codevs1690开关灯
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #def ...
- springmvc的渲染
1.1.1 支持绑定表单对象 我们先来看如下使用form标签的一个示例: Jsp代码 收藏代码 <form:form action="formTag/form.do" met ...
- javascript 获取用户光标,插入文本
图1 如图1所示,点击[函数名称],将函数名称添加到表达式内容框中,点击参数名称,将参数名称index1作为方法的参数添加到表达式内容中的表达式中. 该功能实现主要是采用了javascript获取鼠标 ...
- [转] iOS SDK:iOS调试技巧
原文: http://www.cocoachina.com/ios/20130517/6225.html 为什么你的数组包含3个项目而不是5个?为什么你的游戏运行缓慢?这些都跟调试有关,调试是开发过 ...
- 疯狂学习java web3(javaScript)
js之前有看过,只不过是在C++代码中通过UI引擎调用js进行画图,当时就为语法问题痛苦了半天,结果现在java web了,更是处处是js,再次陷入痛苦中. js实际例子: <!DOCTYPE ...
- JavaScript作用域链详解
JavaScript的作用域链还是很有味道的,搞懂了这个知识点,闭包的问题也就迎刃而解咯 1.JavaScript的全局变量和局部变量 首先,先来看看js的全局变量和局部变量,js不是块级作用域,所以 ...
- Apache Commons DbUtils Problem
- [javascript]事件冒泡处理
<!DOCTYPE html> <html> <head> <style type="text/css"> #box1 { widt ...
- 嵌入式学习笔记(虚拟机共享文件夹配置-Ubuntu系统中)
最近在学习Linux的操作系统,使用的是虚拟机.由于一些文件需要在主机和虚拟机中都要编辑,如果可以使得文件共享,可以极大的提高工作效率! 配置共享文件的步骤如下: [第一步] 在虚拟机软件中设置 [第 ...