【CF587F】Duff is Mad AC自动机+分块】的更多相关文章

[CF587F]Duff is Mad 题意:给出n个串$s_1,s_2..s_n$,有q组询问,每次给出l,r,k,问你编号在[l,r]中的所有串在$s_k$中出现了多少次. $\sum|s_i|,q\le 10^5$ 题解:先将询问离线,改成前缀相减.然后建出AC自动机,考虑分块. 对于长度$>\sqrt n$的询问串,这种串最多$\sqrt n$个,我们每次可以扫一遍整个fail树,处理出每个节点到根的路径上有多少个询问串中的点.然后将所有串一个一个加入到fail树里,假如加入的串的结束节…
题意 给你 \(n\) 个串 \(s_{1\cdots n}\) ,每次询问给出 \(l,r,k\) ,问在 \(s_{l\cdots r}\) 中出现了多少次 \(s_k\) . \(n,q,\sum|s|\le 10^5\) 分析 先建AC自动机的 \(fail\) 树, 我们考虑两种暴力: 将 \(l​\) 到 \(r​\) 中的每个串的末尾节点子树标记,查询 \(s_k​\) 的所有节点 \(fail​\) 树到根的路径和. 将 \(s_k\) 的每个节点的子树标记,查询 \(l\) 到…
HDU4787 GRE Words Revenge 题意: \(N\)次操作,每次记录一个\(01\)串或者查询一个\(01\)串能匹配多少个记录的串,强制在线 题解: 在线的AC自动机,利用分块来降低复杂度,建两个AC自动机,一个大的一个小的,每次往小的里面加字符串,当小的自动机的大小大于一定值之后把小的自动机和大的自动机合并,然后清空小的自动机 每次询问把小的自动机和大的自动机的答案加在一起即可 TIPS:不能把\(fail\)边直接作为子节点来建图,因为之后还要加字符串进去 //#prag…
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=4787 Description Now Coach Pang is preparing for the Graduate Record Examinations as George did in 2011. At each day, Coach Pang can: "+w": learn a word w "?p": read a paragraph p, an…
考虑两一个暴力 1 因为询问\([a,b]\)可以拆成\([1,b]\)-\([1,a-1]\)所以把询问离线,然后就是求\([1,x]\)中被\(S_i\)包含的串的数量.考虑当\([1,x-1]->[1,x]\)时我们把\(S_x\)结束节点在fail树的子树加1.然后询问就是求\(S_i\)在AC自动机上跑时经过所有点的点权用树状数组维护.设\(\sum{len[S_i]}=L\)这样的复杂度就是\(O(mLlogL)\)无法通过此题. 2 依然离线.这次我们把\(S_i\)放在fail树…
题目 有趣的思想 首先暴力的话,自然是对每一个询问在\(AC\)自动机上跑一遍\(k\),看看跑出来的节点在\(fail\)树到根的路径上有多少个\(l\)到\(r\)之间的结束标记就好了 我们发现无论怎么优化好像都不是很可行,考虑一下对根号优化 对于长度大于\(\sqrt{n}\)的串,显然这样的串也不会超过\(\sqrt{n}\)个,我们把这些串在\(AC\)机上跑一遍,之后统计一下子树和,统计一个前缀和就可以回答询问了 这样复杂度是\(O(n\sqrt{n})\) 对于长度小于\(\sqr…
题面传送门 第一眼看成了 CF547E-- 话说 CF587F 和 CF547E 出题人一样欸--还有另一道 AC 自动机的题 CF696D 也是这位名叫 PrinceOfPersia 的出题人出的--似乎这位神仙很擅长字符串? 跑题了跑题了-- 令 \(m=\sum|s_i|\) u1s1 我做这题的时候一直在考虑按照 CF547E 的套路对询问进行差分处理,然鹅并没有什么卵用.因为这题相当于每次加入一个字符串时将这个字符串结尾位置 fail 树的子树中的所有节点访问次数 \(+1\),并询问…
正题 题目链接:https://www.luogu.com.cn/problem/CF587F 题目大意 给出\(n\)个字符串\(s\).\(q\)次询问给出\(l,r,k\)要求输出\(s_{l..r}\)在\(s_k\)中出现了多少次. \(1\leq n,q,\sum |s_i|\leq 10^5\) 解题思路 考虑一个比较暴力的做法,先把所有的构出一棵\(AC\)自动机,一个串\(S\)有后缀\(T\)当且仅当在\(fail\)树上\(S\)的节点在\(T\)的子树内. 所以暴力的做法…
这题说的是 有n次操作 +w 表示读入一个字符串,?p 询问这个字符串的子串在那些模板串中有多少个, http://blog.csdn.net/qq574857122/article/details/16826631 就是说先存一部分的字符串,因为每次都要进行重新 建立这个失配指针,也就是说让适当的单词进行失配 指针重建 会达到高效,两个ac自动机,选取sqrt(100000)的时候达到相对优一点,这样我们 当第一棵树超过了 800的时候我们就将第一棵树的东西存入第二棵树这样我们可以相对减少对失…
题面描述丢失了... 给n个串模板串,然后再给你m个串,对于这m个串的每个串,问在[L,R]的模板串中,在多少个串中出现过; 这题的正解是对于后m个串建AC自动机,然后离线,在fail树上树链求并. 然而我想脑抽地打一下后缀数组: 如果用后缀数组的话,跟喵星球上的点名差不多,但是要在[L,R]中,所以可以用Gty的二逼妹子序列一样的套路,把权值分块而不用树状数组: 这样可以做到nsqrt(n);但是由于串有几百万长,求SA就T了... #include<iostream> #include&l…