来自FallDream的博客,未经允许,请勿转载,谢谢。


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希望找出最长的扭动回文串。
n<=10^5
 
不难证明最长的扭动回文串是由一个中心的最长的回文串向两边延伸得到的。
所以先马拉车,然后二分+哈希判断即可。
还要判断一下两个串分别对称的情况。
#include<iostream>
#include<cstdio>
#include<vector>
#define MN 200000
#define rint register int
#define getchar() (*S++)
char BB[<<],*S=BB;
using namespace std;
inline int read()
{
int x = ; char ch = getchar();
while(ch < '' || ch > '') ch = getchar();
while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
return x;
}
inline char Getchar()
{
char c;
do c=getchar(); while(c<'A'||c>'Z');
return c;
} int n,mx,pos,Lt[MN+],Rt[MN+],ans=;
unsigned int f[MN+],F[MN+],pw[MN+];
char A[MN+],B[MN+]; int Solve(int Lt,int Rt)
{
int l=,r=min(Lt,n-Rt+),mid,ans=;
while(l<=r)
{
mid=l+r>>;
unsigned int ha1,ha2;
ha1=f[Lt-mid+]-pw[mid]*f[Lt+];
ha2=F[Rt+mid-]-pw[mid]*F[Rt-];
if(ha1==ha2) ans=mid,l=mid+;
else r=mid-;
}
return ans;
} int main()
{
fread(BB,,<<,stdin);
n=read();pw[]=;
for(rint i=;i<=n;++i) A[i<<]=Getchar(),pw[i]=pw[i-]*;
for(rint i=;i<=n;++i) B[i<<]=Getchar();
for(rint i=;i<=n+;++i) A[i*-]=B[i*-]=']';
mx=,pos=;n=n*+;
for(rint i=n;i;--i) f[i]=f[i+]*+A[i]-'A'+;
for(rint i=;i<=n;++i) F[i]=F[i-]*+B[i]-'A'+;
for(rint i=;i<=n;++i)
{
if(i<=mx) Lt[i]=min(mx-i+,Lt[*pos-i]);
else Lt[i]=;
while(i-Lt[i]>=&&i+Lt[i]<=n&&A[i-Lt[i]]==A[i+Lt[i]]) ++Lt[i];
if(Lt[i]+i->mx) mx=Lt[i]+i-,pos=i;
if(i&) {if(Lt[i]>)ans=max(ans,Solve(i-Lt[i],i+Lt[i]-)+Lt[i]/*);}
else ans=max(ans,Solve(i-Lt[i],i+Lt[i]-)+(Lt[i]-)/*+);
ans=max(ans,(Lt[i]-(i%==))/*+(i%==));
}
mx=n+;pos=n+;
for(rint i=n;i;--i)
{
if(i>=mx) Rt[i]=min(i-mx+,Rt[*pos-i]);
else Rt[i]=;
while(i-Rt[i]>=&&i+Rt[i]<=n&&B[i-Rt[i]]==B[i+Rt[i]]) ++Rt[i];
if(i-Rt[i]+<mx) mx=i-Rt[i]+,pos=i;
if(i&){ if(Rt[i]>) ans=max(ans,Solve(i-Rt[i]+,i+Rt[i])+Rt[i]/*);}
else ans=max(ans,Solve(i-Rt[i]+,i+Rt[i])+(Rt[i]-)/*+);
ans=max(ans,(Rt[i]-(i%==))/*+(i%==));
}
for(rint x=;x<=n;++x)
if((!(x&))&&A[x]==B[x]) ans=max(ans,Solve(x-,x+)+);
printf("%d",ans);
return ;
}

[bzoj4755][Jsoi2016]扭动的回文串的更多相关文章

  1. BZOJ4755: [JSOI2016]扭动的回文串——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4755 JYY有两个长度均为N的字符串A和B. 一个“扭动字符串S(i,j,k)由A中的第i个字符到 ...

  2. BZOJ4755 JSOI2016扭动的回文串(二分答案+哈希)

    显然答案应该是由单串以某位置为中心的极长回文串继续在另一个串里拓展得到的.枚举中间位置二分答案,哈希判断即可.注意考虑清楚怎么处理偶回文,比如像manacher一样加分隔符. #include< ...

  3. BZOJ4755 [JSOI2016]扭动的回文串 【后缀数组】【manacher】

    题目分析: 我写了史上最丑的后缀数组,怎么办? 首先manacher一遍两个串,这样只用考虑第三问.用$作为间隔符拼接两个串,把第一个串翻转.枚举回文中心,取最长的回文串,对于剩下的部分利用LCP匹配 ...

  4. [BZOJ4755][JSOI2016]扭动的回文串(manacher+Hash)

    前两种情况显然直接manacher,对于第三种,枚举回文中心,二分回文半径,哈希判断即可. #include<cstdio> #include<algorithm> #defi ...

  5. 【BZOJ4755】 [Jsoi2016]扭动的回文串

    BZOJ4755 [Jsoi2016]扭动的回文串 Solution 考虑对于他给出的 A中的一个回文串: B中的一个回文串: 或者某一个回文的扭动字符串S(i,j,k) 这样子几个限制,我们1,2就 ...

  6. 【BZOJ4755】扭动的回文串(Manacher,哈希)

    [BZOJ4755]扭动的回文串(Manacher,哈希) 题面 BZOJ 题解 不要真的以为看见了回文串就是\(PAM,Manacher\)一类就可以过. 这题显然不行啊. 我们主要考虑如何解决跨串 ...

  7. [BZOJ]4755: [Jsoi2016]扭动的回文串

    Time Limit: 10 Sec  Memory Limit: 512 MB Description JYY有两个长度均为N的字符串A和B. 一个"扭动字符串S(i,j,k)由A中的第i ...

  8. 【题解】Luogu P4324 [JSOI2016]扭动的回文串

    原题传送门 这题实际挺水的 先对两个字符串分别跑马拉车 就能求出1.2类扭动回文串最大的长度 考虑第三类的扭动回文串\(S(i,j,k)\),一定可以表示为\(A(i,l)+A(l+1,j)+B(j, ...

  9. [JSOI2016]扭动的回文串

    题目 非常板子了 看到求什么最长的回文,我们就想到枚举回文中心的方法 首先对于这个回文串只包含在一个串内的情况,我们随便一搞就可以了,大概\(Manacher\)一下就没有了 对于那种扭动的回文串,我 ...

随机推荐

  1. maven创建web工程

    使用eclipse插件创建一个web project 首先创建一个Maven的Project如下图 我们勾选上Create a simple project (不使用骨架) 这里的Packing 选择 ...

  2. sqlserver学习_01

    sqlserver的学习成长之路,每一个技术的学习过程都是值得让人回味的,现在百度上关于sqlser的资料很多,但是都太杂,希望能为大家分享一点简单易懂的干货,跟大家一起进步学习. 一.建表 1.创建 ...

  3. JAVA_SE基础——52.匿名内部类

    电信的电箱烧了,害我断了2天网,真拿命,耽误了 Java匿名内部类的总结: 没有名字的内部类.就是内部类的简化形式.一般只用一次就可以用这种形式.匿名内部类其实就是一个匿名子类对象.想要定义匿名内部类 ...

  4. JAVA_SE基础——23.类的定义

    黑马程序员入学blog ... java 面向对象的语言 对象:真实存在的唯一的实物. 比如:我家的狗, 类: 实际就是对某种类型事物的共性属性与行为的抽取.  抽象的概念...   比如说:车   ...

  5. Mysql数据库主从配置

    一.为什么要使用数据库主从架构 一个网站损耗资源最厉害的就是数据库,最易崩溃的也是数据库,而数据库崩溃带来的后果是非常严重的.数据库分为读和写操作,在实际的应用中,读操作的损耗远比写操作多太多,因此读 ...

  6. SpringCloud的服务注册中心(一)

    一.概念和定义 1.服务治理:服务注册与服务发现 服务注册中心,提供服务治理功能,用来实现各个微服务实例的自动注册与发现. 服务注册与发现对于微服务系统来说非常重要.有了服务发现与注册,维护人员就不需 ...

  7. Spark入门(1-1)什么是spark,spark和hadoop

    一.Spark是什么? Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎,可用来构建大型的.低延迟的数据分析应用程序. Spark是UC Berkeley AMP lab (加 ...

  8. python基础——面向对象进阶

    python基础--面向对象进阶 1.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 ...

  9. python基础——列表推导式

    python基础--列表推导式 1 列表推导式定义 列表推导式能非常简洁的构造一个新列表:只用一条简洁的表达式即可对得到的元素进行转换变形 2 列表推导式语法 基本格式如下: [expr for va ...

  10. 28.C++- 单例类模板(详解)

    单例类 描述 指在整个系统生命期中,一个类最多只能有一个实例(instance)存在,使得该实例的唯一性(实例是指一个对象指针)  , 比如:统计在线人数 在单例类里,又分为了懒汉式和饿汉式,它们的区 ...