来自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. JAVA面向对象的多态性

    什么是多态?简而言之就是相同的行为,不同的实现. 而多态也分为静态多态(重载).动态多态(重写)和动态绑定. 静态动态,实际就是指的重载的概念,是系统在编译时,就能知晓该具体调用哪个方法.动态多态指在 ...

  2. 去掉xcode编译warning:ld: warning: directory not found for option '-L

    选择工程, 编译的 (targets) 选择 Build Settings 菜单 查找 Library Search Paths 和 Framework Search Paths, 删掉编译报warn ...

  3. 第三篇:Python字符编码

    一 .了解字符编码的知识储备 1计算机基础知识 1.2文本编辑器存取文件的原理(nodepat++,Pycharm,word) #.打开编辑器就打开了启动了一个进程,是在内存中的,所以,用编辑器编写的 ...

  4. jquery基础总结 -- 转载

    jquery的each里面return的使用 在使用jquery的each方法时, return false相当于break,是跳出each循环,return true相当于continue,是继续循 ...

  5. SQLite 带你入门

    SQLite数据库相较于我们常用的Mysql,Oracle而言,实在是轻量得不行(最低只占几百K的内存).平时开发或生产环境中使用各种类型的数据库,可能都需要先安装数据库服务(server),然后才能 ...

  6. JAVA_SE基础——22.面向对象的概念

    我写博客是为了提升自己和为了进入黑马程序员学习,还有分享些自己的心得给大家,希望能帮助大家学习JAVA. 我是自学的,如果写的有错误或者能更好的修改的请提出. 在这里我先引用下<think in ...

  7. Linux的rsync 配置,用于服务器之间远程传大量的数据

    [教程主题]:rsync [课程录制]: 创E [主要内容] [1] rsync介绍 Rsync(Remote Synchronize) 是一个远程资料同步工具,可通过LAN/WAN快速同步多台主机, ...

  8. crontab的mysqldump备份任务未能完全正确执行的故障处理

    crontab是每个运维一线人员必须掌握的技术,熟练运用crontab可以自动帮助我们执行重复性的工作,提高运维的工作效率.它就像一个闹钟,在特定的时间,准时响应并执行相应的任务.如果你的工作经常与L ...

  9. 用javascript做别踩白块游戏2

    这一次做一个好一点的,要求黑块自动下落,且速度逐渐加快 <!DOCTYPE html> <html> <head> <!-- 禁用缩放功能 --> &l ...

  10. Linux CentOS7.0 (03)安装验证 docker

    一.安装docker 1.升级 Linux 的软件包和内核 sudo yum update 2.安装 docker (1) sudo yum install docker  (2).验证docker安 ...