内存限制:256 MiB 时间限制:1000 ms

题目描述

JYY 有两个长度均为 N 的字符串 A 和 B。
一个「扭动字符串」S(i,j,k)S(i,j,k)S(i,j,k) 由 A 中的第 i 个字符到第 j 个字符组成的子串与 B 中的第 j个字符到第 k 个字符组成的子串拼接而成。 比如,若 A=’XYZ’,B=’UVW’,则扭动字符串S(1,2,3)=S(1,2,3)=S(1,2,3)=’XYVW’。
JYY 定义一个「扭动的回文串」为如下情况中的一个:
1. A 中的一个回文串;
2.B 中的一个回文串;
3.或者某一个回文的扭动字符串S(i,j,k)S(i,j,k)S(i,j,k)
现在 JYY希望找出最长的扭动回文串。

输入格式

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

输出格式

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

样例输入

5
ABCDE
BAECB

样例输出

5

样例解释

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

数据范围与提示

对于所有的数据,1≤N≤1051≤N≤1051\leq N \leq 10^5。

题解

在A,BA,BA,B两串上的回文串不管用manachermanachermanacher还是回文自动机都很好处理,关键在于解决“扭动字符串”的情况。我们考虑讨论回文串上最特殊的点——回文串的中点属于哪一个串。记讨论的回文中心为点kkk,当k" role="presentation">kkk在AAA串上时,”扭动字符串”的拐点一定在A" role="presentation">AAA串上以kkk为中心形成的最长回文串的右端点;同理,当k" role="presentation">kkk在BBB串上时,”扭动字符串”的拐点一定在B" role="presentation">BBB串上以kkk为中心形成的最长回文串的左端点。因此,我们只需枚举k" role="presentation">kkk的位置,并用manachermanachermanacher算法算出左右端点(一般与回文串中点有关的题,多会用到manachermanachermanacher),最后用二分法枚举最长能延伸的长度(回文串长度满足二分性质),并用hashhashhash检验即可(O(1)O(1)O(1)检验回文串的重要方法)。

代码

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cmath>
typedef long long ll;
using namespace std;
const int maxn=2e5+5;
const ll mod=1e9+7;
const ll seed=131;
ll n,ans,mi[maxn],inv[maxn];
struct node
{ll len,pos,maxx,rad[maxn];ll val1[maxn],val2[maxn];char c[maxn],temp[maxn];void init(){maxx=len=pos=0,c[++len]='$',val1[0]=val2[0]=0;for(ll i=1;i<=n;i++) c[++len]=temp[i],c[++len]='$';}void manacher(){for(ll i=1;i<=len;i++){if(i>maxx) rad[i]=1;else rad[i]=min(rad[pos*2-i],maxx-i+1);while(i-rad[i]>0&&i+rad[i]<=len&&c[i-rad[i]]==c[i+rad[i]]) rad[i]++;if(i+rad[i]-1>maxx) maxx=i+rad[i]-1,pos=i;if(rad[i]>ans) ans=rad[i];}}void Hash(){for(ll i=1;i<=len;i++){val1[i]=(val1[i-1]+c[i]*mi[i])%mod;val2[i]=(val2[i-1]+c[i]*inv[i])%mod;}}
}A,B;
ll ksm(ll x,ll y)
{ll temp=1;while(y){if(y&1) temp=temp*x%mod;y>>=1,x=x*x%mod;}return temp;
}
bool check1(ll x,ll y)
{ll x1=x-A.rad[x],x2=x1-y+1;ll num1=(A.val1[x1]-A.val1[x2-1]+mod)*inv[x2]%mod;x1=x+A.rad[x]-2,x2=x1+y-1;ll num2=(B.val2[x2]-B.val2[x1-1]+mod)*mi[x2]%mod;return num1==num2;
}
bool check2(ll x,ll y)
{ll x1=x+B.rad[x],x2=x1+y-1;ll num1=(B.val2[x2]-B.val2[x1-1]+mod)*mi[x2]%mod;x1=x-B.rad[x]+2,x2=x1-y+1;ll num2=(A.val1[x1]-A.val1[x2-1]+mod)*inv[x2]%mod;return num1==num2;
}
int main()
{scanf("%lld%s%s",&n,A.temp+1,B.temp+1),A.init(),B.init();A.manacher(),B.manacher();mi[0]=inv[0]=1,mi[1]=seed,inv[1]=ksm(seed,mod-2);for(ll i=2;i<=A.len;i++){mi[i]=mi[i-1]*mi[1]%mod;inv[i]=inv[i-1]*inv[1]%mod;}A.Hash(),B.Hash();for(ll i=1;i<=A.len;i++){ll l=0,r=min(i-A.rad[i],A.len-(i+A.rad[i])+1);while(l<=r){ll mid=(l+r)>>1;if(check1(i,mid)) l=mid+1;else r=mid-1;}ans=max(ans,A.rad[i]+r);}for(ll i=1;i<=B.len;i++){ll l=0,r=min(i-B.rad[i],B.len-(i+B.rad[i])+1);while(l<=r){ll mid=(l+r)>>1;if(check2(i,mid)) l=mid+1;else r=mid-1;}ans=max(ans,B.rad[i]+r);}printf("%lld\n",ans-1);return 0;
}

【JSOI2016】扭动的回文串相关推荐

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

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

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

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

  3. [JSOI2016]扭动的回文串

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 微服务领域,为什么选SpringCloud而不是Dubbo?
  2. 手机站点开发及手机中图片加速显示img的Canvas方法
  3. Oracle 11g 数据库启动和关闭
  4. Windows下打包maven项目,编写bat脚本,dos命令在后台运行与关闭
  5. apache2 配置php,Windows配置PHP5与Apache2
  6. Linux 移除python Error: Trying to remove “yum”, which is protected
  7. mysql数据应用从入门_MYSQL数据库应用从入门到精通----读书笔记
  8. Chrome 将不再允许 https:// 页面加载 HTTP 资源
  9. Java--Json解析
  10. python关闭exe程序_Python打包exe程序一行简单的代码为什么就是那么多人不知道?...
  11. 机器学习与深度学习视频讲解
  12. Vtokendapp公链诠释
  13. FX5U Socket通信
  14. 中标麒麟桌面版7.0 u盘安装
  15. 重新开始学Java——集合框架之Collection
  16. 传感技术复习笔记(7)——压电式传感器
  17. 计算机网络跨考看,计算机网络试题第一章概述_跨考网
  18. uniapp微信小程序图片上传
  19. HEX文件和BIN文件总结及hex文件流转bin文件流示例代码
  20. 数据结构-线性表(严书代码实现)

热门文章

  1. ajax提交到action乱码问题
  2. Linux:开发:valgrind报错问题总结(2022新)
  3. RK3399驱动开发 | 04 - WK2124串口芯片驱动浅析
  4. 2020北京考研英语一80+经验
  5. Java 面试(一) | Java基础部分
  6. 【报表开发】:BI---新视界---请休假个人报表
  7. alin的学习之路:面试题 计算机网络相关
  8. Public Key Retrieval is not allowed解决
  9. ArcGis实战:土地利用变化矩阵与土地利用变化图制作
  10. Vue cli项目,使用富文本编辑器WangEditor,8小时摸爬滚打后,弃坑Tinymce、UEditor、Quill