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\)一下就没有了 对于那种扭动的回文串,我 ...
随机推荐
- OSG-CompositeViewer
原文连接地址:http://www.osgchina.org/index.php?Itemid=490&id=134:usecompositiv&option=com_content& ...
- MySQL☞having子句
having子句:是跟group by结合使用,对分组以后的数据再次进行过滤,经常跟聚合函数结合使用 格式: select 列名/聚合函数 from 表名 where 条件 group by ...
- Python3.6+selenium3.8+Firefox5.7 环境搭建
大家好,我是阿哲,本人是从php转岗过来学习测试的一名小菜! 在学习selenium过程中,发现运行selenium有很多的问题. 我们在利用pip install selenium 安装的最新版后, ...
- Consul 简介
Consul包含很多组件,总体来数,Consul是一种服务发现和配置工具. 服务发现:一个客户端提供自己的服务,例如api服务,或者mysql服务,另一个客户端就可以利用Consul通过DNS或者ht ...
- JAVA基础学习之路(二)方法定义,重载,递归
一,方法的定义: package test; public class test1 { public static void main(String args[]) { int result = ad ...
- solidity 智能合约操作
合约编译 #!/usr/bin/env python # coding: utf8 import json import os # Solc Compiler from functools impor ...
- Appium基础环境搭建(windows)---基于python
1 JDK安装 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 安装注意:安装 ...
- 20172333 2017-2018-2 《Java程序设计》第7周学习总结
20172333 2017-2018-2 <Java程序设计>第7周学习总结 教材学习内容 1.继承是创建新类的快捷方式之一,继承可以使用父类的所有方法及对象. 2.继承具有单向性,父类不 ...
- 20162328蔡文琛week02
学号 20162328 <程序设计与数据结构>第2周学习总结 教材学习内容总结 这周学习了课本中的第二章内容,比起第一章,本章难度有略微底稿,从刚开始的显示字符转变为简单的加减乘除运算,经 ...
- c# 四则运算出错
不同类型值之间不可直接相减,long和short得出的差继续参与运算出错. 有待深究.