BZOJ4755: [JSOI2016]扭动的回文串——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4755
JYY有两个长度均为N的字符串A和B。一个“扭动字符串S(i,j,k)由A中的第i个字符到第j个字符组成的子串与B中的第j个字符到第k个字符组成的子串拼接而成。比如,若A=’XYZ’,B=’UVW’,则扭动字符串S(1,2,3)=’XYVW’。JYY定义一个“扭动的回文串”为如下情况中的一个:1.A中的一个回文串;2.B中的一个回文串;3.或者某一个回文的扭动字符串S(i,j,k)现在JYY希望找出最长的扭动回文串。
我是一个大sb看错题不然这题就很sb了而且我还对字符串一窍不通。
先写manacher预处理两个串每个点的最大回文串半径。
然后(以枚举A串上的回文中心i为例),显然i的回文串一定要包含i在A的最大回文串(因为如果舍弃一些A的话,则有可能剩下的一点无法和B匹配,故选i在A的最大回文串一定不会使答案变差。)
二分长度哈希即可。
#include<map>
#include<cmath>
#include<stack>
#include<queue>
#include<cstdio>
#include<cctype>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef unsigned long long ll;
const int N=2e5+;
const int B=;
int n,ans,p[][N];
char s1[N],s2[N];
ll ha[N],hb[N],qpow[N];
void manacher(char *s,int on){
s[]='@';
for(int i=n;i>=;i--)s[i<<]=s[i];
for(int i=;i<=*n+;i+=)s[i]='#';
s[*n+]='?';int m=*n+;
int mx=,id;
for(int i=;i<=m;i++){
if(i<mx)p[on][i]=min(p[on][*id-i],mx-i);
else p[on][i]=;
while(s[i+p[on][i]]==s[i-p[on][i]])p[on][i]++;
if(i+p[on][i]>mx){
mx=i+p[on][i];id=i;
}
ans=max(ans,p[on][i]-);
}
}
inline bool pan(int l1,int r1,int l2,int r2){
ll h1=ha[r1]-ha[l1-]*qpow[r1-l1+];
ll h2=hb[l2]-hb[r2+]*qpow[r2-l2+];
return h1==h2;
}
int main(){
scanf("%d%s%s",&n,s1+,s2+);
manacher(s1,);manacher(s2,);n=*n+;
qpow[]=;
for(int i=;i<=n;i++)qpow[i]=qpow[i-]*B;
for(int i=;i<=n;i++)ha[i]=ha[i-]*B+s1[i];
for(int i=n;i>=;i--)hb[i]=hb[i+]*B+s2[i];
for(int i=;i<=n;i++){
int l=,r=min(i-p[][i],n-(i+p[][i]-)+);
while(l<r){
int mid=(l+r+)>>;
int r1=i-p[][i],l1=r1-mid+,l2=i+p[][i]-,r2=l2+mid-;
if(pan(l1,r1,l2,r2))l=mid;
else r=mid-;
}
ans=max(ans,l+p[][i]-);
}
for(int i=;i<=n;i++){ int l=,r=min(i-p[][i]+,n-(i+p[][i])+);
while(l<r){
int mid=(l+r+)>>;
int r1=i-p[][i]+,l1=r1-mid+,l2=i+p[][i],r2=l2+mid-;
if(pan(l1,r1,l2,r2))l=mid;
else r=mid-;
}
int r1=i-p[][i]+,l1=r1-l+,l2=i+p[][i],r2=l2+l-;
ans=max(ans,l+p[][i]-);
}
printf("%d\n",ans);
return ;
}
+++++++++++++++++++++++++++++++++++++++++++
+本文作者:luyouqi233。 +
+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+
+++++++++++++++++++++++++++++++++++++++++++
BZOJ4755: [JSOI2016]扭动的回文串——题解的更多相关文章
- [bzoj4755][Jsoi2016]扭动的回文串
来自FallDream的博客,未经允许,请勿转载,谢谢. JYY有两个长度均为N的字符串A和B. 一个“扭动字符串S(i,j,k)由A中的第i个字符到第j个字符组成的子串与B中的第j个字符到第k个字符 ...
- BZOJ4755 JSOI2016扭动的回文串(二分答案+哈希)
显然答案应该是由单串以某位置为中心的极长回文串继续在另一个串里拓展得到的.枚举中间位置二分答案,哈希判断即可.注意考虑清楚怎么处理偶回文,比如像manacher一样加分隔符. #include< ...
- BZOJ4755 [JSOI2016]扭动的回文串 【后缀数组】【manacher】
题目分析: 我写了史上最丑的后缀数组,怎么办? 首先manacher一遍两个串,这样只用考虑第三问.用$作为间隔符拼接两个串,把第一个串翻转.枚举回文中心,取最长的回文串,对于剩下的部分利用LCP匹配 ...
- [BZOJ4755][JSOI2016]扭动的回文串(manacher+Hash)
前两种情况显然直接manacher,对于第三种,枚举回文中心,二分回文半径,哈希判断即可. #include<cstdio> #include<algorithm> #defi ...
- 【BZOJ4755】 [Jsoi2016]扭动的回文串
BZOJ4755 [Jsoi2016]扭动的回文串 Solution 考虑对于他给出的 A中的一个回文串: B中的一个回文串: 或者某一个回文的扭动字符串S(i,j,k) 这样子几个限制,我们1,2就 ...
- 【BZOJ4755】扭动的回文串(Manacher,哈希)
[BZOJ4755]扭动的回文串(Manacher,哈希) 题面 BZOJ 题解 不要真的以为看见了回文串就是\(PAM,Manacher\)一类就可以过. 这题显然不行啊. 我们主要考虑如何解决跨串 ...
- 【题解】Luogu P4324 [JSOI2016]扭动的回文串
原题传送门 这题实际挺水的 先对两个字符串分别跑马拉车 就能求出1.2类扭动回文串最大的长度 考虑第三类的扭动回文串\(S(i,j,k)\),一定可以表示为\(A(i,l)+A(l+1,j)+B(j, ...
- [BZOJ]4755: [Jsoi2016]扭动的回文串
Time Limit: 10 Sec Memory Limit: 512 MB Description JYY有两个长度均为N的字符串A和B. 一个"扭动字符串S(i,j,k)由A中的第i ...
- [JSOI2016]扭动的回文串
题目 非常板子了 看到求什么最长的回文,我们就想到枚举回文中心的方法 首先对于这个回文串只包含在一个串内的情况,我们随便一搞就可以了,大概\(Manacher\)一下就没有了 对于那种扭动的回文串,我 ...
随机推荐
- Ruby 基础教程1-9
异常 1.异常结构 [ begin] ... rescue [retry] ... [ensure] . ...
- meta-data获取小结
android 开发中: 在AndroidManifest.xml中,<meta-data>元素可以作为子元素, 被包含在<activity>.<applicat ...
- Python文件操作大全
Python 编程文件操作大全 文件打开模式 打开模式 执行操作 'r' 以只读方式打开文件(默认) 'w' 以写入的方式打开文件,会覆盖已存在的文件 'x' 如果文件已经存在,使用此模式打开将引 ...
- GameplayKit的GKStateMachine用法与实例
GKStateMachine 玩家进入GameScene场景中 -> 通过GKStateMachine进入到指定的游戏状态GKState 在GameScene场景中 -> 根据不同的逻辑调 ...
- (原) MaterialEditor部- UmateriaEditor中 Node编译过程和使用(1)
@author: 白袍小道 转载说明原处 插件同步在GITHUB: DaoZhang_XDZ 最后YY需求(手滑) 1.在理清楚基础套路和细节后,自定义纹理资源,并加入到现有UE材质系统 2. ...
- jQuery用unbind方法去掉hover事件及其他方法介绍
近日项目开发十分的繁忙,其中一个需求是实现响应式导航.(响应式的问题我们在css相关的博客中再交流) 大家都知道导航是需要下来菜单效果的,必然就会用到 jQuery的 hover() 方法.若是导航放 ...
- ELK部署方法
最近经理开会说公司要安装ELK日志管理让我们搭建ELK,下面是我搭建步骤和流程,用三台机测试机器搭建的. 软件包我都 给你们放/usr/local/src/elk目录下安装目录都放在/usr/loca ...
- django启动创建用户失败
a django应用启动 b 访问127.0.0.1:8000,报错信息如下,原因为没有这个用户需要创建下用户 c 创建用户过程中报错原因是因为添加了app需要告诉django,这个 模型发生了改变, ...
- Ext JS 6学习文档-第8章-主题和响应式设计
Ext JS 6学习文档-第8章-主题和响应式设计 主题和响应式设计 本章重点在 ExtJS 应用的主题和响应式设计.主要有以下几点内容: SASS 介绍和入门 主题 响应式设计 SASS 介绍和入门 ...
- SPOJ 694 Distinct Substrings/SPOJ 705 New Distinct Substrings(后缀数组)
Given a string, we need to find the total number of its distinct substrings. Input T- number of test ...