Time Limit: 10 Sec  Memory Limit: 512 MB

Description

  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希望找出最长的扭动回文串。

Input

  第一行包含一个正整数N。
  第二行包含一个长度为N的由大写字母组成的字符串A。
  第三行包含一个长度为N的由大写字母组成的字符串B。
  1≤N≤10^5。

Output

  输出的第一行一个整数,表示最长的扭动回文串。

Sample Input

  5
  ABCDE
  BAECB

Sample Output

  5
  最佳方案中的扭动回文串如下所示(不在回文串中的字符用.表示):
  .BC..
  ..ECB

Solution

  一个扭动回文串可以拆成3个部分,第一部分在A,第二部分是A或B的一个回文子串,第三部分在B,其中第一部分翻转后和第三部分相同,并且肯定存在一个最优解,它的第二部分是它回文中心向外延伸得到的最长的回文串,对A和B分别跑manacher找到各个回文中心的最长回文半径后二分+hash即可。

Code

#include<cstdio>
#include<algorithm>
using namespace std;
#define MN 100000
#define X 31
#define MOD 998244353
char a[MN+5],b[MN+5],s[MN*2+5];
int n,p[MN+5],ha[MN+5],hb[MN+5],d[MN*2+5],ans;
void solve(char*S)
{int i,mx=0,L,R,l,r,mid,res;for(s[0]='.',i=1;i<2*n;++i)s[i]=i&1?S[i+1>>1]:'#';for(i=1;i<2*n;++i){d[i]=mx+d[mx]<i?0:min(d[2*mx-i],mx+d[mx]-i);while(s[i+d[i]+1]==s[i-d[i]-1])++d[i];if(i+d[i]>mx+d[mx])mx=i;L=i-d[i]+2>>1;R=i+d[i]+1>>1;if(S==a)--R;else ++L;for(l=0,r=min(L-1,n-R);l<=r;){mid=l+r>>1;if((1LL*(ha[L-1]-1LL*ha[L-mid-1]*p[mid])%MOD+MOD)%MOD==(1LL*(hb[R+1]-1LL*hb[R+mid+1]*p[mid])%MOD+MOD)%MOD)res=mid,l=mid+1;else r=mid-1;}ans=max(ans,R-L+2+res*2);}
}
int main()
{int i,mx;scanf("%d%s%s",&n,a+1,b+1);for(p[0]=i=1;i<=n;++i)p[i]=1LL*p[i-1]*X%MOD;for(i=1;i<=n;++i)ha[i]=(1LL*ha[i-1]*X+a[i])%MOD;for(i=n;i;--i)hb[i]=(1LL*hb[i+1]*X+b[i])%MOD;solve(a);solve(b);printf("%d",ans);
}

转载于:https://www.cnblogs.com/ditoly/p/BZOJ4755.html

[BZOJ]4755: [Jsoi2016]扭动的回文串相关推荐

  1. bzoj 4755: [Jsoi2016]扭动的回文串 manachar+hash+二分

    题意 JYY有两个长度均为N的字符串A和B. 一个"扭动字符串S(i,j,k)由A中的第i个字符到第j个字符组成的子串与B中的第j个字符到第k个字符组成的子串拼接而成. 比如,若A='XYZ ...

  2. bzoj4755: [Jsoi2016]扭动的回文串 manacher+二分+Hash

    bzoj4755: [Jsoi2016]扭动的回文串 Description JYY有两个长度均为N的字符串A和B. 一个"扭动字符串S(i,j,k)由A中的第i个字符到第j个字符组成的子串 ...

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

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

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

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

  5. [JSOI2016]扭动的回文串

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

  6. BZOJ4755 [Jsoi2016]扭动的回文串

    标签:Manacher,hash,二分 题目 题目传送门 Description JYY有两个长度均为N的字符串A和B. 一个"扭动字符串S(i,j,k)由A中的第i个字符到第j个字符组成的 ...

  7. 洛谷 P4324 [JSOI2016]扭动的回文串 manacher+字符串hash

    题目描述 JYY有两个长度均为 NNN 的字符串 AAA 和 BBB. 一个扭动字符串 S(i,j,k)S(i,j,k)S(i,j,k) 由 AAA 中的第 iii 个字符到第 jjj 个字符组成的子 ...

  8. P4324 [JSOI2016]扭动的回文串

    传送门 对\(A\).\(B\)串各跑一遍\(manacher\),求出第\(1\).\(2\)类扭动回文串的最大长度. 考虑第三类的扭动回文串\(S(i,j,k)\),一定可以表示为\(A(i,l) ...

  9. 【JSOI2016】扭动的回文串

    内存限制:256 MiB 时间限制:1000 ms 题目描述 JYY 有两个长度均为 N 的字符串 A 和 B. 一个「扭动字符串」S(i,j,k)S(i,j,k)S(i,j,k) 由 A 中的第 i ...

最新文章

  1. 南华大学c语言多少分才能过_成人高考难吗?多少分可以过?
  2. 什么是词向量?word2vec、Glove、FastText分别是什么?
  3. 可以接受失败,但不选择放弃
  4. Spring进阶的几大要点,你有做到吗?
  5. 图形界面终端下打印内核调试信息
  6. WinCE中sources文件中targetlibs与sourcelibs的作用与区别
  7. java 继承的内存分配_图解Java继承内存分配
  8. 从实例入手学习Shiro与Web的整合
  9. [蓝桥杯]算法训练 The Red Button||codeforces 325E(哈密顿回路)
  10. c标签判断true false jsp_Java学习知识点:小白如何掌握JSP技术?
  11. 微信小程序中如何使用setData修改数组或对象中的某一参数
  12. 中国移动计算机二面笔试题,中国移动笔试面试经验
  13. 手机CAD如何快速看图下载?
  14. Alfred插件之有道翻译配置过程
  15. 蓝桥杯 第39级台阶
  16. 袋鼠云研发手记 | 袋鼠云EasyManager的TypeScript重构纪要
  17. python 爬取壁纸网站并保存图片到本地
  18. PLSQL官网, 及个版本下载地址和下载方法
  19. STM32驱动MPU6050基于IIC协议
  20. CPU中的八个通用寄存器

热门文章

  1. MySQL数据库常用基本语句及管理
  2. python在国内外研究现状_国内外研究现状,水平和发展趋势-开题报告
  3. 【CodeForces 1255E1 --- Send Boxes to Alice [Easy Version]】
  4. DSP芯片CSL的使用
  5. 金纳米粒子修饰MIL-101骨架材料(AuNPs/MIL-101)/负载COF-TpPa-1(Au NPs/COF-TpPa-1)|齐岳试剂
  6. ring buffer 环形队列 C++实现
  7. A Fixed-Point Model for Pancreas Segmentation in Abdominal CT Scans
  8. ios共享账号公众号_家人公众号和共享相册
  9. 文本与文本处理(一)
  10. 南华大学的计算机专业学校排名,2019南华大学专业排名