BZOJ 3940 Censoring ( Trie 图 )
题意 : 中文题、点链接
分析 :
直接建 Trie 图、在每一个串的末尾节点记录其整串长度、方便删串操作
然后对于问询串、由于可能有删串操作
所以在跑 Trie 图的过程当中需要拿个栈记录一下路径
跑 Trie 图的意思就是说将问询串字符一个个拿出来
然后一直找当前节点的下一个对应字母的节点
由于是 Trie 图、所以在 Fail 的时候也会自动跑到对应的节点
这和普通的 AC 自动机不一样、在 Fail 的时候要每次暴力跳 Fail 节点
然后直接模拟即可
#include<bits/stdc++.h>
#define LL long long
#define ULL unsigned long long
#define scl(i) scanf("%lld", &i)
#define scll(i, j) scanf("%lld %lld", &i, &j)
#define sclll(i, j, k) scanf("%lld %lld %lld", &i, &j, &k)
#define scllll(i, j, k, l) scanf("%lld %lld %lld %lld", &i, &j, &k, &l)
#define scs(i) scanf("%s", i)
#define sci(i) scanf("%d", &i)
#define scd(i) scanf("%lf", &i)
#define scIl(i) scanf("%I64d", &i)
#define scii(i, j) scanf("%d %d", &i, &j)
#define scdd(i, j) scanf("%lf %lf", &i, &j)
#define scIll(i, j) scanf("%I64d %I64d", &i, &j)
#define sciii(i, j, k) scanf("%d %d %d", &i, &j, &k)
#define scddd(i, j, k) scanf("%lf %lf %lf", &i, &j, &k)
#define scIlll(i, j, k) scanf("%I64d %I64d %I64d", &i, &j, &k)
#define sciiii(i, j, k, l) scanf("%d %d %d %d", &i, &j, &k, &l)
#define scdddd(i, j, k, l) scanf("%lf %lf %lf %lf", &i, &j, &k, &l)
#define scIllll(i, j, k, l) scanf("%I64d %I64d %I64d %I64d", &i, &j, &k, &l)
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define lowbit(i) (i & (-i))
#define mem(i, j) memset(i, j, sizeof(i))
#define fir first
#define sec second
#define VI vector<int>
#define ins(i) insert(i)
#define pb(i) push_back(i)
#define pii pair<int, int>
#define VL vector<long long>
#define mk(i, j) make_pair(i, j)
#define all(i) i.begin(), i.end()
#define pll pair<long long, long long>
#define _TIME 0
#define _INPUT 0
#define _OUTPUT 0
clock_t START, END;
void __stTIME();
void __enTIME();
void __IOPUT();
using namespace std;
;
;
;
char ans[max_len];
int pos[max_len];
;
struct Aho{
struct StateTable{
int nxt[Letter];
int fail, cnt, len;
bool vis;
void init(){
memset(nxt, , sizeof(nxt));
fail = ;
cnt = ;
len = ;
vis = false;
}
}Node[max_node];
int sz;
queue<int> que;
inline ].init(); sz = ; }
inline void insert(char *s, int len){
;
; i<len; i++){
int idx = s[i] - 'a';
if(!Node[now].nxt[idx]){
Node[sz].init();
Node[now].nxt[idx] = sz++;
}
now = Node[now].nxt[idx];
}
Node[now].len = len;
Node[now].cnt++;
}
inline void build(){
Node[].fail = -;
que.push();
while(!que.empty()){
int top = que.front(); que.pop();
; i<Letter; i++){
if(Node[top].nxt[i]){
) Node[ Node[top].nxt[i] ].fail = ;
else{
int v = Node[top].fail;
){
if(Node[v].nxt[i]){
Node[ Node[top].nxt[i] ].fail = Node[v].nxt[i];
break;
}v = Node[v].fail;
}) Node[ Node[top].nxt[i] ].fail = ;
}que.push(Node[top].nxt[i]);
}?Node[ Node[top].fail ].nxt[i]:;
}
}
}
// int Match(char *s){
// int now = 0, res = 0;
// for(int i=0; s[i]!='\0'; i++){
// int idx = s[i] - 'a';
// now = Node[now].nxt[idx];
// int tmp = now;
// while(tmp != 0 && !Node[tmp].vis){
// res += Node[tmp].cnt;
// Node[tmp].vis = true;
// Node[tmp].cnt = 0;
// tmp = Node[tmp].fail;
// }
// }
// return res;
// }
void query(char * s){
int len = strlen(s);
;
pos[now] = now;
; i<len; i++){
int idx = s[i] - 'a';
now = Node[now].nxt[idx];
pos[++top] = now;
ans[ top] = s[i];
){
top -= Node[now].len;
now = pos[top];
}
}
; i<=top; i++) putchar(ans[i]); puts("");
}
}ac;
char str[max_len];
char tmp[max_len];
int main(void){__stTIME();__IOPUT();
scs(str);
int len = strlen(str);
int n;
sci(n);
ac.init();
; i<n; i++){
scs(tmp);
ac.insert(tmp, strlen(tmp));
}
ac.build();
ac.query(str);
__enTIME();;}
void __stTIME()
{
#if _TIME
START = clock();
#endif
}
void __enTIME()
{
#if _TIME
END = clock();
cerr<<"execute time = "<<(double)(END-START)/CLOCKS_PER_SEC<<endl;
#endif
}
void __IOPUT()
{
#if _INPUT
freopen("in.txt", "r", stdin);
#endif
#if _OUTPUT
freopen("out.txt", "w", stdout);
#endif
}
BZOJ 3940 Censoring ( Trie 图 )的更多相关文章
- 【Trie图】BZOJ3940-[Usaco2015 Feb]Censoring
[题目大意] 有一个匹配串和多个模式串,现在不断删去匹配串中的模式串,求出最后匹配串剩下的部分. [思路] 众所周知,KMP的题往往对应着一道AC自动机quq.本题同BZOJ3942(KMP),这里改 ...
- BZOJ 1030 [JSOI2007]文本生成器 (Trie图+DP)
题目大意:给你一堆字符串,一个串不合法的条件是这些字符串中任意一个是这个串的子串,求合法的串的数量 其实这道题比 [HNOI2008]GT考试 那道题好写一些,但道理是一样的 只不过这道题的答案可以转 ...
- BZOJ 1444 [JSOI2009]有趣的游戏 (Trie图/AC自动机+矩阵求逆)
题目大意:给你$N$个长度相等且互不相同的模式串,现在有一个字符串生成器会不断生成字符,其中每个字符出现的概率是$p_{i}/q_{i}$,当生成器生成的字符串包含了某个模式串,则拥有该模式串的玩家胜 ...
- BZOJ 1195 [HNOI2006]最短母串 (Trie图+状压+bfs最短路)
BZOJ1195 LOJ10061 题目大意:给你$n$个模式串,求一个最短且字典序最小的文本串并输出这个串,$n<=12,len<=50$ 首先对所有模式串构造$Trie$图,$Trie ...
- AC自动机相关Fail树和Trie图相关基础知识
装载自55242字符串AC自动机专栏 fail树 定义 把所有fail指针逆向,这样就得到了一棵树 (因为每个节点的出度都为1,所以逆向后每个节点入度为1,所以得到的是一棵树) 还账- 有了这个东西, ...
- 【BZOJ-2938】病毒 Trie图 + 拓扑排序
2938: [Poi2000]病毒 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 609 Solved: 318[Submit][Status][Di ...
- 【hihoCoder】1036 Trie图
题目:http://hihocoder.com/problemset/problem/1036 给一个词典dict,词典中包含了一些单词words.要求判断给定的一个文本串text中是否包含这个字典中 ...
- 【hihoCoder 1036】Trie图
看了一下简单的$Trie图$,调模板调啊调一连调了$2h$,最后发现$-'a'$打成$-'A'$了hhh,有种摔键盘的冲动. $Trie图$是$Trie树$上建立“前缀边”,不用再像在$Trie树$上 ...
- 字符串 --- KMP Eentend-Kmp 自动机 trie图 trie树 后缀树 后缀数组
涉及到字符串的问题,无外乎这样一些算法和数据结构:自动机 KMP算法 Extend-KMP 后缀树 后缀数组 trie树 trie图及其应用.当然这些都是比较高级的数据结构和算法,而这里面最常用和最熟 ...
随机推荐
- Largest Number At Least Twice of Others
In a given integer array nums, there is always exactly one largest element. Find whether the largest ...
- java 8 date time 简单样例
参考 Java 8 Time Api 使用指南-珍藏限量版 Java 8 中处理日期和时间示例 部分样例 import java.time.temporal.TemporalAdjusters; im ...
- 【计算机网络】-介质访问子层-(信道划分介质访问控制&随机访问介质访问控制)
[计算机网络]-介质访问子层-概述 介质访问控制子层功能 解决信道争用的协议,即用于多路访问信道上确定下一个使用者的协议 是数据链路层协议的一部分 介质访问控制子层位置 位于数据链路层的底部! 信道分 ...
- 【GDOI】2018题目及题解(未写完)
我的游记:https://www.cnblogs.com/huangzihaoal/p/11154228.html DAY1 题目 T1 农场 [题目描述] [输入] 第一行,一个整数n. 第二行,n ...
- 2019中山纪念中学夏令营-Day19 数论初步【GCD(最大公约数),素数相关】
关于GCD的一些定理或运用的学习: 1. 2.二进制算法求GCD 思想:使得最后的GCD没有2(提前把2提出来) 代码实现: #include <cstdio> #define int l ...
- idea 新建maven项目时,避免每次都需要指定自己的maven目录
01 .File->Other Settings -> Settings for New Project 02. 将Maven home directory目录修改成我们自己安装Maven ...
- Adam作者大革新, 联合Hinton等人推出全新优化方法Lookahead
Adam作者大革新, 联合Hinton等人推出全新优化方法Lookahead 参与:思源.路.泽南 快来试试 Lookahead 最优化方法啊,调参少.收敛好.速度还快,大牛用了都说好. 最优化方 ...
- Azure中配置和发布 Nginx docker到互联网
当Azure build一个Niginx docker 镜像时,无法通过浏览器访问这个镜像,于是想到了把这个网站发布到互联网中,这样就能验证网站是否正确. 本问跳过如何创建Azure Ubantu的虚 ...
- 剑指offer-扑克牌顺子-知识迁移能力-python
题目描述 LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决 ...
- 02 Linux常用基本命令(二)
1.Linux的文件系统格式 1.以 / 为根目录,成树状结构分布 2.查看根目录下有什么 ls / 3./下有超级用户root的家目录(root),还有普通用户的家目录(/home) 4.常用文件夹 ...