[Luogu3121][USACO15FEB]审查Censoring】的更多相关文章

题面 sol 开一个栈记录依次经过的\(AC\)自动机上的节点编号以及这一次的字母,若匹配到一个串就直接弹掉栈顶的\(len\)个元素,\(len\)为匹配到的模式串长度.弹栈顶直接\(top-=len\)即可. code #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; const int N = 100005; int n…
P3121 [USACO15FEB]审查(黄金)Censoring (Gold) (银的正解是KMP) AC自动机+栈 多字符串匹配--->AC自动机 删除单词的特性--->栈 所以我们先打个AC自动机模板 然后搞2个栈维护: AC自动机目前跑到字典树上的哪个点 已经跑过且没被删除的字符(答案栈) 每次碰到有结尾标记的点,就让2个栈弹出这个点所对应的单词的长度  最后输出第二个栈就行了 attention:输出答案后要换行,否则会蜜汁爆炸7pts P3121 code(P4824要稍作修改):…
题面 就是让你--在字符串A中,如果字符串B是A的子串,那么就删除在A中第一个出现的B,然后拼接在一起,一直重复上述步骤直到B不再是A的子串 |A|\(\le 10^6\) 思路: KMP+栈 1.由于是两个字符串匹配的问题,当然一下子就会想到KMP 2.由于是删去一段区间,很多人第一反应会想到链表,但是在这里,其实删除了一段后,对之前是没有影响的,并且,一定是从后往前删除,所以,更优的存储结构应该是栈. 3.有人会问,为什么删去对前面没有影响,这就根据KMP的原理,做到i这个位置的结果就是最优…
题目: P3121 [USACO15FEB]审查(黄金)Censoring (Gold) 解析: 多字符串匹配,首先想到AC自动机 建立一个AC自动机 因为有删除和拼接这种操作,考虑用栈维护 顺着文本串匹配的方向走,将经过的节点放入栈中,若匹配到一个模式串,就将这个模式串弹出,从栈顶开始继续走 我们再维护一个pos数组,用来维护trie树中节点对应在文本串中的位置 代码 #include <bits/stdc++.h> using namespace std; const int N = 1e…
题面 传送门 Sol AC自动机+栈,每次匹配到栈顶减去这个单词的长度,回到之前的状态 最后栈中留下的就是答案 # include <bits/stdc++.h> # define IL inline # define RG register # define Fill(a, b) memset(a, b, sizeof(a)) using namespace std; typedef long long ll; const int _(1e5 + 5); int ch[26][_], tot…
被自己学校OJ的毒瘤测评姬卡到自闭 Hash+栈+优化暴力 其实思路也很简单,就是把单词存进一个结构体,记录其哈希值和长度,然后就可以开始匹配了 但是,理论复杂度很高,为\(O(n*length)\)虽然实际体验效果不错 所以,为了卡过自家学校的OJ,加了一点小优化 额外维护一个数组\(num[i]\),记录以单词结尾字符的ascll码值为i的单词编号 这样的话,每次遍历的时候的元素个数,就会大大小于单词总个数,会比朴素算法快很多,虽然最坏复杂度还是\({O(n*length)}\) 不过还是祝…
吐槽 数据太水了吧,我AC自动机的trie建错了结果只是RE了两个点,还以为数组开小了改了好久 思路 看到多模板串,字符串匹配,且模板串总长度不长,就想到AC自动机 然后用栈维护当前的字符串位置,如果匹配到了,就从栈里逐个弹出对应的字符,并且回溯到匹配这个单词之前的节点 s每个字符最多会被出栈和入栈各两次,复杂度是\(O(n+m)\)的 代码 #include <cstdio> #include <algorithm> #include <cstring> #inclu…
从原来的单串匹配变成了多串匹配 好像也没什么特别不一样的地方 原来的做法是搞一个栈,之后一旦匹配到就往前弹栈 做法也一样 但是在\(AC\)自动机上暴力跳\(fail\)是要\(T\)的 我们并没有必要去暴力跳\(fail\),只需要存下往后跳\(fail\)能跳到的成功的位置是哪里就好了 这个在预处理的时候处理一下就好了 代码 #include<iostream> #include<cstdio> #include<cstring> #include<queue…
题目传送门 其实这题正解是AC自动机的,字符串哈希吸氧才能过的,但是我太菜了不会...只能先用哈希苟了. 在扫描单词的时候首先把各个单词的哈希值和长度存起来.然后按照长度从小到大将各单词排序.而那个长长的字符串呢,我们就把它一点一点往栈里塞,够最小长度单词的长度时,我们就比较下,这样反复下去.如果遇到相同的字符串,就把他们弹出. 这个思路最巧妙的一点感觉就是用栈了.我自己写哈希的时候遇到删除的情况就布吉岛怎么搞了qwq. 这里的哈希值不能预处理出来的,而是动态维护的.因为有可能会删掉子串.所以只…
这个和bzoj同名题不一样,有多个匹配串 但是思路是一样的,写个AC自动机,同样是开两个栈,一个存字符,一个存当前点在trie树上的位置,然后如果到了某个匹配串的末尾,则弹栈 #include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; const int N=100005; int n,t[N],top; char a[N],b[N],s…