字符串杂题_题解

CF1286E Fedya the Potter Strikes Back

有一个串 S S S 和一个数组 W W W,初始都为空。有 n n n ( 1 ≤ n ≤ 600   000 1\le n\le 600\,000 1n600000) 次操作,每次在 S S S 后加入字符 c i c_i ci ( c i c_i ci 是小写字母),在 W W W 后加入数 w i w_i wi,并询问所有子段 [ L , R ] [L,R] [L,R] ( 1 ≤ L ≤ R ≤ i 1\le L\le R\le i 1LRi) 的权值和。

子段 [ L , R ] [L,R] [L,R] 的权值定义如下:如果 S [ 1 , R − L + 1 ] = S [ L , R ] S[1,R-L+1]=S[L,R] S[1,RL+1]=S[L,R] 则权值为 min ⁡ L ≤ i ≤ R { W i } \min_{L\le i\le R}\{W_i\} minLiR{Wi},否则为 0 0 0

强制在线

题解:队爷写过的,放一个链接


CF1393E2 Twilight and Ancient Scroll (harder version)

给定一个包含 n n n ( 1 ≤ n ≤ 1 0 5 1\le n\le 10^5 1n105) 个字符串的序列 (总长不超过 1 0 6 10^6 106),求在每个字符串中删除一个字符使得序列字典序不降的方案数。

题解:在串内对删一个点后的串排序,发现两个串同的地方在原串是相邻的,于是就能排序了。然后串之前的大小也可以用类似的方法 c h e c k check check 。于是就能 d p dp dp 了。


CF1252D Find String in a Grid

给定 R × C R\times C R×C ( 1 ≤ R , C ≤ 500 1\le R,C\le 500 1R,C500) 的字符矩阵,有 Q Q Q ( 1 ≤ Q ≤ 200   000 1\le Q\le 200\,000 1Q200000) 次询问,每次给定一个字符串 (总长不超过 200   000 200\,000 200000),询问该串在矩阵中以先右后下的方式出现了多少次。

题解 :有两种方法,一种可以暴力把询问串压进 A C AC AC 自动机,然后枚举拐点,把这个拐点最长的串拿进去匹配,减去不合法的个数。另一种可以利用拐点这个性质,给以拐点横着结束,竖着结束的串各自做 S A SA SA ,对询问串枚举拐点,横着合法的是一个区间,竖着合法是一个区间,于是就是二维数点问题了。


CF587F Duff is Mad

给定一个包含 n n n ( 1 ≤ n ≤ 1 0 5 1\le n\le 10^5 1n105) 个字符串的序列 s i s_i si (总长不超过 1 0 5 10^5 105),有 q q q ( 1 ≤ q ≤ 1 0 5 1\le q\le 10^5 1q105) 次询问,每次给定 l l l, r r r, k k k,询问 s l , s l + 1 , … , s r s_l,s_{l+1},\ldots,s_r sl,sl+1,,sr s k s_k sk 中的出现次数之和。

题解:离线,对所有所有串建 A C AC AC 自动机,答案就是在 f a i l fail fail 树上对 s l , . . . , s r s_l,...,s_r sl,...,sr 的结束节点的子树内的所有节点的权值 + 1 +1 +1 s k s_k sk 的每个节点的权值之和。 然后根号分治, ∣ s k ∣ |s_k| sk 大的时候就对大的每个 s k s_k sk 分别计算 1 1 1 n n n 的串在 s k s_k sk 里出现的次数, O ( n n ) O(n\sqrt n) O(nn ) ∣ s k ∣ |s_k| sk 小的时候就做前缀,也是 n \sqrt n n 的。就没啦。


CF547E Mike ans Friends

给定一个包含 n n n ( 1 ≤ n ≤ 2 ⋅ 1 0 5 1\le n\le 2\cdot 10^5 1n2105) 个字符串的序列 s i s_i si (总长不超过 2 ⋅ 1 0 5 2\cdot 10^5 2105),有 q q q ( 1 ≤ q ≤ 5 ⋅ 1 0 5 1\le q\le 5\cdot 10^5 1q5105) 次询问,每次给定 l l l, r r r, k k k,询问 s k s_k sk s l , s l + 1 , … , s r s_l,s_{l+1},\ldots,s_r sl,sl+1,,sr 中的出现次数之和。

题解:建 f a i l fail fail 树,询问离线,从 1 1 1 n n n 枚举 i i i ,把 s i s_i si 每个前缀的节点权值 + 1 +1 +1 ,把要询问的询问了。


HDU6661 Acesrc and String Theory

给定字符串 s s s ( 1 ≤ ∣ s ∣ ≤ 1 0 6 1\le |s|\le 10^6 1s106) 和整数 k k k ( 1 ≤ k ≤ 20 1\le k\le 20 1k20),求 s s s 有多少形如 t k t^k tk 的子串。

题解:正解是 S A SA SA ,我用二分+哈希水过的就不讲了。

posted @ 2022-10-10 20:18  缙云山车神  阅读(16)  评论(0编辑  收藏  举报