bzoj 3325 密码 - Manacher】的更多相关文章

题目传送门 需要root权限的传送点 题目大意 已知一个串,以每个字符为中心的最长回文串长,以及每两个字符中间为中心的最长回文串长.求字典序最小的这样一个串.题目保证有解. 考虑Manacher的过程,假设当前扩展得最远的端点是$mx$. $mx$之内的部分可以根据回文串的性质直接判掉,当$mx$被更新的时候才会出现新的相等关系. 由于题目给出的是最长回文串串长,所以还需要一些不等关系. 因为字符集很小,所以直接开数组打标记就好了. Code #include <bits/stdc++.h>…
题目大意:给你一个字符串每个位置和相邻两个位置为回文中心的最长回文串长度,让你构造一个合法的字典序最小的字符串 挺有意思的构造题 首先按照$Manacher$的思想还原$p$数组 定义$f_{ij}$表示$i$位置不能放$j$这个字符 我们逆模拟$manacher$的构造过程,如果$i+p_{i}>maxR$,那么多出来这部分都要满足回文性质,然后更新$maxR$ 然后,因为回文不能继续扩展,所以$str[i+p_{i}]!=str[i-p_{i}]$,就在f数组里打上标记 每遍历到一个位置,如…
题目传送门 需要高级权限的传送门 题目大意 对于一个01字符串,如果将这个字符串0和1取反后,再将整个串反过来和原串一样,就称作“反对称”字符串. 问给定长度为$n$的一个01串有多少个子串是反对称的. 这个反对称子串满足回文串的对称性质,和"子结构"性质(例如$s$的$[a, b]\ (a + 2 < b)$一段是反对称的,那么$s$的$[a + 1, b - 1]$也是反对称的) 因此我们可以用Manacher来搞这个问题.只是改一下判断的条件罢了. 当然还有Hash + 二…
[BZOJ3325][Scoi2013]密码 Description Fish是一条生活在海里的鱼.有一天他很无聊,就到处去寻宝.他找到了位于海底深处的宫殿,但是一扇带有密码锁的大门却阻止了他的前进.通过翻阅古籍,Fish 得知了这个密码的相关信息: 1. 该密码的长度为N. 2. 密码仅含小写字母. 3. 以每一个字符为中心的最长回文串长度. 4. 以每两个相邻字符的间隙为中心的最长回文串长度. 很快Fish 发现可能有无数种满足条件的密码.经过分析,他觉得这些密码中字典序最小的一个最有可能是…
思路: 这道题思路好奇怪--. 我们先要知道关于x (x可以是间隙) 对称的有几对字母 显然暴力是n^2的 那怎么办呢 先把所有'a'看成1 'b'看成0 意外的发现 这不就是卷积嘛 再倒过来搞一搞 加一下 2^x-1就是包含连续的回文串的解了 然后 跑个manacher 把包含的删掉就好啦 时间复杂度是O(nlogn)的 代码: //By SiriusRen #include <cstdio> #include <complex> #include <cstring>…
Trie树/可持久化线段树 神题啊……搞了我一下午= =(其实第233个提交也是我的) 我一开始的思路:这个找kpm串的过程,其实就跟在AC自动机上沿fail倒着往下走是差不多的(看当前是哪些点的后缀,如果某个串的后缀是当前串,那它的fail就会指向这里)所以就在fail树上bfs一遍,然后找到所有的编号,排序后输出第k小…… 然后顺利地WA了 QAQ 只好取膜拜题解……哦原来只要把每个串倒过来,建Trie树的时候,就相当于找当前这个串的子树! 在子树中统计啊……so easy啦-dfs一遍,把…
关于$\mathrm{Manacher}$算法,网上介绍已经很全面 这里说一下自己的理解 这里的$rad$数组:$rad_i$表示以以位置i为中心的最长回文串的回文半径(不包括i这个点). 朴素的思想大概是从每个点出发像两边扩展,大概$O(n^2)$复杂度?据说$\mathrm{Manacher}$是$O(n)$的(不会证,Orz,大概因为每个位置只会被暴力扩展$O(1)$次)这是因为回文串有对称性,我们可以利用这点来优化算法.现在假设我们已经得到了$i$和$i$以前的$rad$值,现在想直接通…
Description Orez很喜欢搜集一些神秘的数据,并经常把它们排成一个矩阵进行研究.最近,Orez又得到了一些数据,并已经把它们排成了一个n行m列的矩阵.通过观察,Orez发现这些数据蕴涵了一个奇特的数,就是矩阵中上下对称且左右对称的正方形子矩阵的个数. Orez自然很想知道这个数是多少,可是矩阵太大,无法去数.只能请你编个程序来计算出这个数. Input 文件的第一行为两个整数n和m.接下来n行每行包含m个正整数,表示Orez得到的矩阵. Output 文件中仅包含一个整数answer…
BZOJ 洛谷 求给定串的最长双回文串. \(n\leq10^5\). Manacher: 记\(R_i\)表示以\(i\)位置为结尾的最长回文串长度,\(L_i\)表示以\(i\)开头的最长回文串长度.答案就是\(\max\{R_i+L_{i+1}\}\).式子可能会有差别,因为Manacher会在里面加字符.当然我们直接只用'#'位置的\(L_i+R_i\)就可以更新答案啦. Manacher,然后对于位置\(i\),设它的最远延伸距离是\(ex_i\). 然后用\(i-j\)更新\(L_j…
bzoj 4447 小凸解密码 先将原始状态的 \(B\) 处理出来,可以发现,若不修改,则每次指定的起始位置不同,对这个环 \(B\) 带来的影响只有 \(B_0\) 不同,即每次 \(B_0=A_0\) ,其他位置不变.可以询问时修改这个值,询问结束时改回去. 如果要修改,可以发现修改 \(A_i\) 其实只会影响 \(B_i,B_{i+1}\) 的值,也可以较快完成. 只需要用一个 \(set\) 维护环上的零区间,修改,查询时都分情况维护,回答就好了.断环成链(复制一份接在后面)可以减小…