题意: 给出\(n\)个字符串\(s_i\)和\(q\)个询问: \(l,r,k\):\(\sum\limits_{i=l}^{r}count(i, k)\),其中\(count(i,j)\)表示\(s_j\)作为子串在\(s_i\)中出现的次数 分析: 先不考虑查询中\(l,r\)的限制,考虑该字符串\(s_k\)在一个字符串集合中出现的次数. 先将这个字符串集合插入到一棵Trie数中,并且每经过一个节点就将其对应的\(val\)值加\(1\). 这样\(s_k\)对应节点的\(val\)值就…
题意 https://loj.ac/problem/2444 思路 ​多串匹配,考虑 \(\text{AC}\) 自动机.模拟打字的过程,先建出一棵 \(\text{Trie}\) 树,把它变成自动机.对于每一个询问 \((x,y)\) ,相当于求 \(y\) 在 \(\text{Trie}\) 上的父节点中,有多少个是 \(x\) 在 \(\text{fail}\) 树上的子节点. 不难想到离线,我们对于 \(y\) 记录所有 \(x\) ,求出 \(\text{fail}\) 树上的 \(\…
codeforces 547E Mike and Friends 题意 题解 代码 #include<bits/stdc++.h> using namespace std; #define fi first #define se second #define mp make_pair #define pb push_back #define rep(i, a, b) for(int i=(a); i<(b); i++) #define per(i, a, b) for(int i=(b)…
参考:http://blog.csdn.net/no__stop/article/details/12287843 此题利用了ac自动机fail树的性质,fail指针建立为树,表示父节点是孩子节点的后缀 然后更新其影响的字符串的方法,即区间更新,维护最大值,用线段树优化. 而其可以影响的字符串为其在fail树中的子树节点 此题一直MLE,调了一下午+晚上.最后发现. (1)ac自动机中的节点开始直接初始化,应动态初始化(也终于理解了许多人那么做) (2)还有用vector表示树边时,一开始初始c…
题目链接 problem Recently George is preparing for the Graduate Record Examinations (GRE for short). Obviously the most important thing is reciting the words. Now George is working on a word list containing N words. He has so poor a memory that it is too…
[BZOJ2434]阿狸的打字机(AC自动机,树状数组) 先写个暴力: 每次打印出字符串后,就插入到\(Trie\)树中 搞完后直接搭\(AC\)自动机 看一看匹配是怎么样的: 每次沿着\(AC\)自动机走,在每一个节点都跳\(fail\)指针 如果有\(x\)串的末节点,就给答案\(+1\) 这样的话没有必要存下每个串 只要给\(AC\)自动机存一个父亲节点 记录一下每个串的结束位置 倒着往上跳就可以了 这样能够拿到\(40\)分 Update2018.1.25:这份代码对于重复串的处理会有问…
[BZOJ2434]阿狸的打字机(AC自动机,树状数组) 先写个暴力: 每次打印出字符串后,就插入到\(Trie\)树中 搞完后直接搭\(AC\)自动机 看一看匹配是怎么样的: 每次沿着\(AC\)自动机走,在每一个节点都跳\(fail\)指针 如果有\(x\)串的末节点,就给答案\(+1\) 这样的话没有必要存下每个串 只要给\(AC\)自动机存一个父亲节点 记录一下每个串的结束位置 倒着往上跳就可以了 这样能够拿到\(40\)分 Update2018.1.25:这份代码对于重复串的处理会有问…
题面传送门 好久每做过 AC 自动机的题了--做几个题回忆一下罢 AC 自动机能够解决多串匹配问题,注意是匹配,碰到前后缀的问题那多半不在 AC 自动机能解决的范围内. 在初学 AC 自动机的时候相信大家都做过一道题叫做 P2414 [NOI2011] 阿狸的打字机.在这道题中我们用到了两棵树,一棵就是所有串的字典树,称为 trie 树,令一棵是求出每个点的 \(fail_i\) 后,对于所有不是根节点的 \(i\) 连边 \((fail_i,i)\) 后形成的树,称为 fail 树. 在那道题…
题目大概是给几个DNA片段,求构造一个长度n的字符串的方案数,要求这个字符串每个位置的字符都属于某个包含于此字符串的DNA片段. 把那些DNA片段建一个AC自动机.考虑状态的表示: dp[len][x][k]表示长度len且后缀状态为自动机结点x且后k位还不满足要求的方案数 然后转移就是向自动机上四个方向的结点走,如果下一步结点x'是某DNA的后缀且长度比k大,那就是转移到dp[len+1][x'][0]否则转移到dp[len+1][x'][k+1].另外因为DNA最长10,所以第三维k不会超过…
Tree-String Problem 网上的dfs + kmp 复杂度就是错的, 除非算出根据下一个字符直接转移Next数组直接转移, 而求出Next[ i ][ 26 ]数组和丢进AC自动机里面没有区别.. 然后我的AC自动机还写麻烦了.. 我把全部都求进去求fail然后沿着fail推到目标串, 好蠢啊啊. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk m…
Barney was hanging out with Nora for a while and now he thinks he may have feelings for her. Barney wants to send her a cheesy text message and wants to make her as happy as possible. Initially, happiness level of Nora is 0. Nora loves some pickup li…
The best programmers of Embezzland compete to develop a part of the project called "e-Government" — the system of automated statistic collecting and press analysis. We know that any of the k citizens can become a member of the Embezzland governm…
要点 显然ac自动机的板子就可以暴力一下答案了 为了优化时间复杂度,考虑套路fail树的dfs序.发现本题需要当前这个尾点加上所有祖先点的个数,考虑使用树状数组差分一下,在父点+1,在子树后-1,每次询问前缀和即可 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <sstream> #include <string&…
用 AC自动机 来做有点想不到,捞一手就是学一手. 设 dp[ i ][ j ] 表示字符串 c 中的第 i 位到字典树上节点 j 的最大值是多少, word[ j ] 表示在节点 j 下对答案修改的值是多少. 首先可以确定是 s 和 t 塞入字典树时,他们的结尾节点的 word 值显然一个是 1 一个是 -1 ,接下来就是 fail 数组上的一波操作,对于当前节点 j ,我们的 word[ j ] 需要加上 word[ fail[ j ] ] ,即当选到当前节点 j 时候,加上可能匹配到的一个…
题目:https://loj.ac/problem/3055 先写了暴力.本来想的是 n<=300 的那个在树上暴力维护好整个字符串, x=1 的那个用主席树维护好字符串和 nxt 数组.但 x=1 的部分会 TLE ,而且似乎不太对的样子. #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #define ll long long #define pb pu…
国际惯例的题面:考虑我们求解出字符串uvu第一个u的右端点为i,第二个u的右端点为j,我们需要满足什么性质?显然j>i+L,因为我们选择的串不能是空串.另外考虑i和j的最长公共前缀(也就是说其parent树上lca的len),为了保证他们相同,我们需要:j-len>=i-L.整理一下,如果我们已知i,j需要在区间[i+L+1,i+L+len]中.如果我们已知j,i需要在区间[j-L-len,j-L-1]中.于是我们可以写n^2暴力了:暴力维护parent上每个节点的right集合,对于每个i,…
定义 解决文本串和多个模式串匹配的问题: 本质是由多个模式串形成的一个字典树,由tie的意义知道:trie上的每一个节点都是一个模式串的前缀: 在trie上加入fail边,一个节点fail边指向这个节点所代表的前缀的最长后缀节点(除开自身的后缀): 也就是说如果x->y,那么y所代表的串是x所代表的串在trie上出现过的最大后缀: 例子 (黑边为trie,红边为fail) 以"hers","she","his","i"为…
吐槽: 为啥很多人用AC自动机暴力跳都过了?复杂度真的对么? 做法一: AC自动机+树状数组 姓名的问题,中间加个特殊字符连起来即可. 肯定是对点名串建AC自动机(map存儿子),然后第一问就相当于问每个姓名串(以下称作"关键路径")经过了多少个点名串(以下称做"关键点")在fail树中的子树中的至少一点,第二问就相当于问你每条关键路径被多少个关键点经过了在fail树的子树中至少一个点. 所以对于每个关键路径在AC自动机上跑,每跑到一个点把它到根的路径上打上标记(注…
题目链接: http://codeforces.com/gym/101161/attachments 题意: 给出节点数为$n$的树 有$q$次询问,输出$a$节点到$b$节点路程中,经过的边的中位数 数据范围: $1\leq n \leq 100000$ $1\leq q \leq 100000$ 分析: 建一颗主席树,不同的是,节点的根继承的是父节点的根 再用$lca$求出公共祖先$tree[a]+tree[b]-2*tree[lca(a,b)]$ ac代码: #include<bits/s…
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2545  Solved: 1419[Submit][Status][Discuss] Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母.经阿狸研究发现,这个打字机是这样工作的:l 输入小写字母,打字机的一个凹槽中会加入这个字母(这个字母加在凹槽的最…
3172: [Tjoi2013]单词 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 3198  Solved: 1532[Submit][Status][Discuss] Description 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. Input 第一个一个整数N,表示有多少个单词,接下来N行每行一个单词.每个单词由小写字母组成,N<=200,单词长度不超过10^6…
3881: [Coci2015]Divljak Time Limit: 20 Sec  Memory Limit: 768 MBSubmit: 508  Solved: 158[Submit][Status][Discuss] Description Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操作有两种形式: “1 P”,Bob往自己的集合里添加了一个字符串P. “2 x”,Alice询问Bob,集合T中有多少个字符串包…
题目这么说的: 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母.经阿狸研究发现,这个打字机是这样工作的: 输入小写字母,打字机的一个凹槽中会加入这个字母(这个字母加在凹槽的最后). 按一下印有'B'的按键,打字机凹槽中最后一个字母会消失. 按一下印有'P'的按键,打字机会在纸上打印出凹槽中现有的所有字母并换行,但凹槽中的字母不会消失. 例如,阿狸输入aPaPBbP,纸上被打印的字符如下:aaaab我们把纸上打…
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2022  Solved: 1158[Submit][Status][Discuss] Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母.经阿狸研究发现,这个打字机是这样工作的:l 输入小写字母,打字机的一个凹槽中会加入这个字母(这个字母加在凹槽的最…
Fail树就是AC自动机建出来的Fail指针构成的树. [bzoj3172][xsy1713]单词 题意 给定一些单词,求每个单词在所有单词里面的出现次数. 分析 构建Fail树,记录每个单词最后一个位置在Fail树上的位置. 每个单词访问的每个节点的\(has+1\). 然后在Fail树上进行树形dp. 每次询问,求对应位置的dp值. 核心代码 int n; char s[L]; int rt,tot; int loc[N]; struct Trie { int nx[A]; LL has;…
E. e-Government 题目: 给出n个字符串,表示n个人名,有两种操作: ?string ,统计字符串string中出现的属于城市居民的次数. +id,把编号为id的人变为城市居民,如果已经是忽略. -id,把编号为id的人变为不是城市居民,如果已经不是的话忽略. 现有m个操作,对于?输出结果. 分析: 很容易想到建立ac自动机,+-操作倒简单,使用bool数组标记一下即可.对于每个询问,每次都沿着fail指针往上走,遇到了标记为城市居民的字符串时加1,否则继续往上走. 在这显然会TL…
今天是第二天集训.(其实已经是第三天了,只是昨天并没有机会来写总结,现在补上) 上午大家心情都很愉快,因为老师讲了splay树和ac自动机. 但到了下午,我们的教练竟然跑出去耍了(excuse me?),害的我们在一些不懂的地方冥思苦想浪费时间,效率极其低下,所以说只做了点模板题,以后这方面的知识还需要多多练习0.0 1.ac自动机 这东西是kmp的升级版本,由一个模式串升级到了多个模式串,效率依然高. 只要掌握了kmp,ac自动机一般不会有问题.哦,当然你也必须会trie树,这是自动机的基础…
题意 给定 \(n\) 个字符串,\(m\) 个询问,每次询问 \(a\) 字符串的后缀和 \(b\) 字符串的前缀最多能匹配多长. \(1\leq n,m \leq 10^5\) 思路 多串匹配,考虑 \(\text{AC}\)自动机,对 \(n\) 个串建自动机,观察这个结构,不难发现 \(Trie\) 树的结构和前缀有关,\(fail\) 树的结构和后缀有关. 考虑离线,对于每个 \(b\) ,存储它对应的 \(a\) ,我们通过在自动机上扫 \(b\) 来回答.由于扫到某节点 \(u\)…
$zjq$神犇一眼看出$AC$自动机 $Orz$ 直接就讲做法了 首先对每个串建出$AC$自动机 将$fail$树找到 然后求出$dfs$序 我们发现一个单词 $S_i$是$S_j$的子串当且仅当$S_j$的某个前缀$T$通过$fail$树可以t跳到$S_i$的结束位置(感性理解一下,不太懂可以去找找特地讲$fail$树的博客) 我们记$f_i$为做到第$i$个串且$S_i$必选的最大值 则有 $f_i=max\{f_j+val[i]\}(j<i$ $\&\&$ $S_j$ 的结束点…
Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的: l 输入小写字母,打字机的一个凹槽中会加入这个字母(这个字母加在凹槽的最后). l 按一下印有'B'的按键,打字机凹槽中最后一个字母会消失. l 按一下印有'P'的按键,打字机会在纸上打印出凹槽中现有的所有字母并换行,但凹槽中的字母不会消失. 例如,阿狸输入aPaPBbP,纸上被打印的字符如下:…