BZOJ 2342: [Shoi2011]双倍回文】的更多相关文章

2342: [Shoi2011]双倍回文 Time Limit: 10 Sec Memory Limit: 128 MB Description Input 输入分为两行,第一行为一个整数,表示字符串的长度,第二行有个连续的小写的英文字符,表示字符串的内容. Output 输出文件只有一行,即:输入数据中字符串的最长双倍回文子串的长度,如果双倍回文子串不存在,则输出0. Sample Input 16 ggabaabaabaaball Sample Output 12 HINT N<=50000…
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 输入分为两行,第一行为一个整数,表示字符串的长度,第二行有个连续的小…
2342: [Shoi2011]双倍回文 Time Limit: 10 Sec  Memory Limit: 128 MB Description Input 输入分为两行,第一行为一个整数,表示字符串的长度,第二行有个连续的小写的英文字符,表示字符串的内容. Output 输出文件只有一行,即:输入数据中字符串的最长双倍回文子串的长度,如果双倍回文子串不存在,则输出0. Sample Input 16 ggabaabaabaaball Sample Output 12 HINT N<=5000…
题面:[SHOI2011]双倍回文 题解:具体实现时,就是在更新mr时维护前半段是回文串的最长回文串就好了 正确性的话,因为到i时如果i+RL[i]-1<=mr,那么答案肯定在i之前就维护过了: 因此只有在i+RL[i]-1>mr时需要维护答案 由于mr最多被更新N<<1次,所以时间效率是对的:在找前半段最长的回文串时,记得从外向内枚举,一旦发现答案就立即break,否则效率会假 最后,注意只需要判前半段是否满足条件就好了,一是因为我们不清楚后半段相应位置的真实RL值,二是这是个回…
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2342 [题目大意] 记Wr为W串的倒置,求最长的形如WWrWWr的串的长度. [题解] 我们发现要找到这样一个双倍回文,我们可以采取在大的回文串中寻找小的回文串的方式, 在回文串i中找到回文串j满足j+r[j]>=i那么(i-j)<<1就可以用来更新答案. 在查找过程中,我们发现在下标小的i中无法被用到的j在下标大的i中也无法被用到, 因此对于无效的查找区间我们用并查集进行优…
题目大意:略 先建出$PAM$ 因为双倍回文串一定是4的倍数,所以找出$PAM$里所有$dep$能整除4的节点 看这个串是否存在一个回文后缀,长度恰好为它的一半,沿着$pre$链往上跳就行了 暴跳可能会$T$,所以倍增了跳 如果被卡空间,可以把trs数组当成倍增数组 #include <cmath> #include <vector> #include <cstdio> #include <cstring> #include <algorithm>…
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2342 题意:求最长子串使得它有四个相同的回文串SSSS相连组成. 首先跑一边Manacher,初始化出以每一个点为最长回文串的左端点,然后按左端点排序. 枚举中间点$x$,然后找右面的中间点$y$,使得$y$满足 $y-p_y\leq x$ $y\leq x+r_x\div 2$ 用set维护y,然后求出最接近$x+r_x\div 2$,用--upper_bound()返回$y$的迭代…
题意: 求最长子串使得它有四个相同的回文串SSSS相连组成 枚举中间x 找右边的中间y满足 y-r[y]<=x y<=x+r[x]/2 用个set维护 注意中间只能是# #include <cstdio> #include <cstring> #include <algorithm> #include <set> using namespace std; ; typedef long long ll; int n; char s[N],str[N…
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2342 [题意] 求出形如w wR w wR的最长连续子串. [思路] 用manacher算法计算出p[],表示以i与i+1为中心的最长回文字串长度/2 枚举第一个wR的结束位置x,当且仅当y-p[y]<=x且y<=x+p[x]/2子串[x+1,y]是一个答案,更新ans. 满足的条件是一个二维偏序,按照y-p[y]排序,在查询x之前保证将所有满足第一个式子的x'加入set,查询时找…
Sol Manacher. 非常裸的Manacher啊...为什么有那么多人写Manacher+并查集?Set?Treap?...好神奇... 你只需要在 \(p[i]++\) 的位置加上判断就可以了,不需要任何数据结构维护答案... 你要保证两个点都在'#'字符上就可以了... Code /************************************************************** Problem: 2342 User: BeiYu Language: C++…
题意 N<=500000 题解 维护一个set可以用堆来解决. #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> #include<set> #include<queue> using namespace std; ; ],m,p[N*]; int n,f[N],now,ans; char…
题目 传送门:QWQ 分析 (sb如我写了发不知道什么东西在洛谷上竟然水了84分 嗯咳 设$ i $为双重回文的中心 如果$ j~i $ 可以被算作答案,只有满足如下两式: $ p[j]+j \geq i $ $ 2*(i-j) \leq p[j] $ 计算时我们先做一次马拉车,然后按照 $ p[j]+j \geq i $排序,保证它的单调,接着把满足$ 2*(i-j) \leq p[j] $扔进set里询问. 代码 #include <bits/stdc++.h> using namespa…
2342: [Shoi2011]双倍回文 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 923  Solved: 317[Submit][Status] Description Input 输入分为两行,第一行为一个整数,表示字符串的长度,第二行有个连续的小写的英文字符,表示字符串的内容. Output 输出文件只有一行,即:输入数据中字符串的最长双倍回文子串的长度,如果双倍回文子串不存在,则输出0. Sample Input 16 ggabaa…
题面: 洛谷:[SHOI2011]双倍回文‘ 题解: 首先有一个性质,本质不同的回文串最多O(n)个. 所以我们可以对于每个i,求出以这个i为结尾的最长回文串,然后以此作为长串,并判断把这个长串从中间劈开后左边的一半是否也是一个回文串(判断左边那半的中点的回文半径是否可以跨过当前长串的中点). 复杂度O(n) // luogu-judger-enable-o2 #include<bits/stdc++.h> using namespace std; #define R register int…
BZOJ2342 Shoi2011 双倍回文 Description Input 输入分为两行,第一行为一个整数,表示字符串的长度,第二行有个连续的小写的英文字符,表示字符串的内容. Output 输出文件只有一行,即:输入数据中字符串的最长双倍回文子串的长度,如果双倍回文子串不存在,则输出0. Sample Input 16 ggabaabaabaaball Sample Output 12 HINT N<=500000 Manacher板子处理出来p数组后转化成原来串中的g数组(缩小数据规模…
https://www.lydsy.com/JudgeOnline/problem.php?id=2342 解法一: 对原串构建回文自动机 抽离fail树,从根开始dfs 设len[x]表示节点x表示的最长回文子串长度 在fail树上,x到根节点的路径上的点表示的字符串包含了x代表的回文子串的所有回文后缀/前缀 所以若dfs到了x,若len[x]为偶数,标记len[x]*2,如果在x的子树中能找到len为len[x]*2的点,那么len[x]*2*2就可以用来更新答案 #include<cstd…
浅谈\(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\)的第一个#,那么肯定第三个…
Description   Input 输入分为两行,第一行为一个整数,表示字符串的长度,第二行有个连续的小写的英文字符,表示字符串的内容. Output 输出文件只有一行,即:输入数据中字符串的最长双倍回文子串的长度,如果双倍回文子串不存在,则输出0. Sample Input 16 ggabaabaabaaball Sample Output 12 HINT N<=500000 首先manacher求出len数组 我们发现一个一个以i为中心的回文串[l,r]是双倍回文 [i,r]也是一个回文…
题目描述 输入 输入分为两行,第一行为一个整数,表示字符串的长度,第二行有个连续的小写的英文字符,表示字符串的内容. 输出 输出文件只有一行,即:输入数据中字符串的最长双倍回文子串的长度,如果双倍回文子串不存在,则输出0. 样例输入 16 ggabaabaabaaball 样例输出 12 提示 N<=500000 题意就是要求找到一个最长的回文串满足它的一个回文后缀长度是它的一半,也就是在回文自动机的$fail$树上找到一个所代表的回文串的长度为$4$的倍数的点使它有一个祖先所代表的的回文串的长…
Description   Input 输入分为两行,第一行为一个整数,表示字符串的长度,第二行有个连续的小写的英文字符,表示字符串的内容. Output 输出文件只有一行,即:输入数据中字符串的最长双倍回文子串的长度,如果双倍回文子串不存在,则输出0. Sample Input 16 ggabaabaabaaball Sample Output 12 HINT N<=500000 Solution 假设manacher过程中求到了位置i那么我们从i位置一步一步往左右扩张求len[i]的时候扩张…
点此看题面 大致题意: 求一个字符串中有多少个长度为偶数的回文串,它的一半也是回文串. \(Manacher\)算法 这应该是\(Manacher\)算法一道比较好的入门题,强烈建议在做这题之前先去学一学\(Manacher\)算法. 大致思路 如果你会\(Manacher\)算法,其实这题的思路应该还是比较清晰的. 只要在更新最大右边界的同时,判断每一个新出现的回文串是否为双倍回文串,并更新\(ans\)即可. 代码 #include<bits/stdc++.h> #define max(x…
传送门 manacher...... 先跑一边manacher是必须的 然后枚举双倍回文串的对称轴x 把这个双倍回文串分成4段,w wR w wR 发现,只有当 y <= x + p[x] / 2 && y - p[y] <= x 时,y最大才是最优解 也就是y在第三段,并且以y为中心的回文串要扩展到x的或左边,并且y的回文串要被x的包在里面 那么 (y-x) * 4 中最大的就是答案 我们不妨按照 y - p[y] 排序y,枚举x,依次添加y进入set,从set中找最大的 y…
题目描述 记字符串 w 的倒置为 w^R^ .例如 (abcd)^R^=dcba , (abba)^R^=abba . 对字符串x,如果 x 满足 x^R^=x ,则称之为回文:例如abba是一个回文,而abed不是. 如果x能够写成的 ww^R^ww^R^ 形式,则称它是一个"双倍回文".换句话说,若要 x 是双倍回文,它的长度必须是 \(4\) 的倍数,而且 x , x 的前半部分, x 的后半部分都要是回文.例如 abbaabba 是一个双倍回文,而 abaaba 不是,因为它的…
Palindromeness Let us define the palindromeness of a string in the following way: If the string is not a palindrome, its' palindromeness is zero. The palindromeness of an one-letter string is 1. The palindromness of a string S of the length greater t…
题目链接 发现双倍回文串一定是中心是#的回文串. 所以考虑枚举#点.发现以\(i\)为中心的双倍回文的左半部分是个回文串,其中心一定位于\(i-\frac{pal[i]-1}2\)到\(i-1\)之间,而且越远越好.所以我们用一个\(set\)来存一下目前为止回文右端点\(\geq i\)的点,然后在\(set\)中找到大于等于\(i-\frac{pal[i]-1}2\)的最小值即可. #include<bits/stdc++.h> using namespace std; #define f…
前言 用了一种很奇怪的方法来解,即二分判断回文,再进行某些奇怪的优化.因为这个方法很奇怪,所以希望如果有问题能够 hack 一下. 题解 我们发现,这题中要求的是字符串 \(SS'SS'\),其中 \(S'\) 是 \(S\) 的反向,那么这个串长度必定为 \(4\) 的倍数.那么我们对于每个位置,寻找一组最大的 \(SS'\),然后找这前面是否有一个与他相同的 \(SS'\),如果有,那么这两组字符串组成一个双倍回文.但是问题在于对于某些情况,例如 bbbbbbbbbbb,在第 \(3\) 和…
题解:先建pam,然后在fail树上dfs,从上到下的链如果有当前长度最远回文串的一半,那么更新答案 //#pragma GCC optimize(2) //#pragma GCC optimize(3) //#pragma GCC optimize(4) //#pragma GCC optimize("unroll-loops") //#pragma comment(linker, "/stack:200000000") //#pragma GCC optimiz…
传送门 听说有大佬用manacher$O(n)$过此题……太强啦…… 说一下PAM的做法吧.(看了题解之后发现)蛮简单的 我们肯定要先建出回文自动机的 然后如果是枚举每一个节点暴跳fail指针肯定得T 那么我们对于每一个节点记录一个$trans[i]$,表示小于等于它长度一半的节点 这个可以在建自动机的时候顺便求出来,具体看代码 然后对每一个节点判断长度是否模4为0且$trans[i]$的长度是它的一半就好了 //minamoto #include<cstdio> #include<cs…
这题属于博主还未填坑系列,先嘴巴AC,到时候有时间再搞字符串时,再来好好填坑. 废话不多说上题: 题解: 显然是和马拉车有关的吧,我们可以先对整个串跑一个马拉车,然后枚举‘#’好字符,并以他为中心,在枚举一个在其回纹半径之内的‘#’号,检查二号#是否能覆盖一号,可以的话显然就是一个双回文了,但他的复杂度是n平方的,所以要优化,优化也不难, 思考一下,就会发现,当一号的回文半径很大时,如果二号#不能覆盖一号#,那么当一号#被更新更向右时,显然也是无法覆盖的 所以路径压缩以下,用并查集来实现. 代码…
题意 考虑对每个节点\(x\)维护\(lastpos_x\)表示\(x\)的所有后缀回文串中第一个\(len\leqslant len_x/2\)并且能和\(x\)最后一个字符匹配的,之后枚举节点,判断该点回文串是否合法. 求\(lastpos_x\): 如果新建节点\(x\)满足\(len_x\leqslant 2\),那么\(lastpos_x=fail_x\). 不然则从\(x\)的父亲节点向上跳,边跳边判断即可. code: #include<bits/stdc++.h> using…