首先要吐槽LRJ,书上给的算法标签是“有难度,需要结合其他数据结构”,学完Manacher才发现几乎一裸题 题目的意思是问原串中有多少个wwRwwR这样的子串,其中wR表示w的反串 比较容易看出来,wwRwwR本身是一个回文串,wwR也是一个回文串 最裸的暴力是,我们枚举每一个回文串,然后判断这个回文串的左半边是不是也是个回文串 然后我们考虑用Manacher 我们考虑Manacher的工作原理,是在充分利用原先的信息的前提下,不重复,不遗漏的枚举每个回文串 也就是说,在Manacher的运算过…
前言 用了一种很奇怪的方法来解,即二分判断回文,再进行某些奇怪的优化.因为这个方法很奇怪,所以希望如果有问题能够 hack 一下. 题解 我们发现,这题中要求的是字符串 \(SS'SS'\),其中 \(S'\) 是 \(S\) 的反向,那么这个串长度必定为 \(4\) 的倍数.那么我们对于每个位置,寻找一组最大的 \(SS'\),然后找这前面是否有一个与他相同的 \(SS'\),如果有,那么这两组字符串组成一个双倍回文.但是问题在于对于某些情况,例如 bbbbbbbbbbb,在第 \(3\) 和…
2342: [Shoi2011]双倍回文 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 923  Solved: 317[Submit][Status] Description Input 输入分为两行,第一行为一个整数,表示字符串的长度,第二行有个连续的小写的英文字符,表示字符串的内容. Output 输出文件只有一行,即:输入数据中字符串的最长双倍回文子串的长度,如果双倍回文子串不存在,则输出0. Sample Input 16 ggabaa…
[BZOJ2342]双倍回文(回文树) 题面 BZOJ 题解 构建出回文树之后 在\(fail\)树上进行\(dp\) 如果一个点代表的回文串长度为\(4\)的倍数 并且存在长度为它的一半的回文后缀 那么就是可行的 如何维护长度是一半的回文后缀? \(fail\)树上的父亲一定包括了它的所有的回文后缀 因此在\(fail\)树上\(dfs\),同时记录一下每个长度的回文出现的次数 这样访问到一个节点就可以直接检查了 #include<iostream> #include<cstdio&g…
2342: [Shoi2011]双倍回文 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1123  Solved: 408 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=2342 Description 输入分为两行,第一行为一个整数n,表示字符串的长度,第二行有n个连续的小写的英文字符,表示字符串的内容. Input 输入分为两行,第一行为一个整数,表示字符串的长度,第二行有个连续的小…
题目链接:双倍回文 回文自动机第二题.构出回文自动机,那么一个回文串是一个“双倍回文”,当且仅当代表这个串的节点\(u\)顺着\(fail\)指针往上跳,可以找到一个节点\(x\)满足\(2len_x=len_u\).当然还需要\(len_u\)是\(4\)的倍数. 然后我们把\(fail\)树构出来,在上面\(dfs\)一遍就做完了. 下面贴代码: #include<iostream> #include<cstdio> #include<cstring> #inclu…
题面: 洛谷:[SHOI2011]双倍回文‘ 题解: 首先有一个性质,本质不同的回文串最多O(n)个. 所以我们可以对于每个i,求出以这个i为结尾的最长回文串,然后以此作为长串,并判断把这个长串从中间劈开后左边的一半是否也是一个回文串(判断左边那半的中点的回文半径是否可以跨过当前长串的中点). 复杂度O(n) // luogu-judger-enable-o2 #include<bits/stdc++.h> using namespace std; #define R register int…
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2342 [题目大意] 记Wr为W串的倒置,求最长的形如WWrWWr的串的长度. [题解] 我们发现要找到这样一个双倍回文,我们可以采取在大的回文串中寻找小的回文串的方式, 在回文串i中找到回文串j满足j+r[j]>=i那么(i-j)<<1就可以用来更新答案. 在查找过程中,我们发现在下标小的i中无法被用到的j在下标大的i中也无法被用到, 因此对于无效的查找区间我们用并查集进行优…
题意 记\(s_R\)为\(s\)翻转后的串,求一个串最长的形如\(ss_Rss_R\)的子串长度 题解 这有一个复杂度明显\(O(n)\)的做法,思路来自网上某篇博客 一个双倍回文串肯定当且仅当本身是一个回文串且左右两边都是回文串 所以对于右边的回文串,到它中心\(i\)的时候,\(manacher\)记录的\(maxr\)一定\(>i\) 如果满足这个条件,那就判断\(i\).\(i\)关于\(mid\)的对称串是否有交点,有交点就说明这是双倍回文串:还要注意不能以字母为中心,因为回文串必须…
浅谈\(Manacher\):https://www.cnblogs.com/AKMer/p/10431603.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=2342 假设我已经将原字符串的\(p\)数组求好了. 双倍回文肯定是#\(W\)#\(W^R\)#\(W\)#\(W^R\)# 我们枚举中间一个#,求在它的回文半径的一半以内最靠前的第一个满足\(i+p_i-1\geqslant pos\)的第一个#,那么肯定第三个…