P3604 美好的每一天

lxl 的题还真是毒瘤…

题意大概是 l ~ r 区间有多少个回文子串…
然后考虑怎么做…数字的出现次数怎么看都是和莫队没有关系的。
不难想到,想要一段区间回文,必须小于等于一个有奇数次出现的字母。

那么考虑 -> 这题

你就有想法了,就是把一个区间异或起来。剩下的值就是奇数次出现的。

那么又可以想到 一共有 26 个字母 你可以把每个字母压成 \(2^0\) ~ \(2^25\)

这样就可以当做数值来做了。

问题1:怎么求区间异或和( O(1) 的 复杂度 )

问题2: 怎么莫队(区间的当然和平常的莫队不太一样)

请读者 仔细思考以上问题再继续下翻。

异或和是可以通过像前缀和的方式求的
前缀和的预处理 \(sum_i\) = \(sum_{i-1}\) + \(a_i\)
查询 \(sum_{i=l}^{r}\) \(sum_r\) - \(sum_{l-1}\)

异或前缀和也是可以做的 类似正常的前缀和
\(sum_i\) = \(sum_{i-1}\) ^ \(a_i\)
\(\oplus_{i=l}^{r}\) = \(sum_r\) ^ \(sum_{l-1}\)

然后考虑怎么莫队
当你把 \(sum_i\) 设成了 1 到 i 的 异或和
你需要做的就是求这个区间的两个数的异或和是否由二进制位组成。
然后这个问题就转化成 \(\mathfrak{0(26n)}\) 的预处理了

猜你喜欢

转载自www.cnblogs.com/Isaunoya/p/11642428.html
今日推荐