传送门

题目描述

JYY有两个长度均为 NN 的字符串 AA 和 BB。

一个扭动字符串S(i,j,k)S(i,j,k) 由 AA 中的第 ii 个字符到第 jj 个字符组成的子串与 BB 中的第 jj 个字符到第 kk 个字符组成的子串拼接而成。

比如,若 A=A= ’XYZ’,B=B=’UVW’,则扭动字符串 S(1,2,3)=S(1,2,3)= ’XYVW’。

JYY 定义一个扭动的回文串为如下情况中的一个:

AA 中的一个回文串;
BB 中的一个回文串;
或者某一个回文的扭动字符串S(i,j,k)S(i,j,k)
现在 JYY 希望找出最长的扭动回文串。

输入格式

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

输出格式

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

输入输出样例

输入 #1复制
5
ABCDE
BAECB
输出 #1复制
5

说明/提示

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

.BC…
…ECB
对于所有的数据,1 \leq n \leq 10 ^ 51≤n≤10
5

上代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
typedef  unsigned long long ll;
using namespace std;
const int maxn=1e5+5,INF=0x3f3f3f3f,base=233;
inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9')s=s*10+ch-'0',ch=getchar();return s*w;
}
int n,ans,len1[maxn],len2[maxn],len11[maxn],len22[maxn];
char a[maxn],b[maxn];
ll h1[maxn],g1[maxn],h2[maxn],g2[maxn],poww[maxn];
int Binary1(int l,int r,int now){int mid;while(l<=r){mid=(l+r)>>1;if(h1[now]-h1[now-mid]*poww[mid]==g1[now]-g1[now+mid]*poww[mid])l=mid+1;else r=mid-1;}return l-1;
}
int Binary11(int l,int r,int now){int mid;while(l<=r){mid=(l+r)>>1;if(h1[now]-h1[now-mid]*poww[mid]==g1[now+1]-g1[now+1+mid]*poww[mid])l=mid+1;else r=mid-1;}return l-1;
}
int Binary2(int l,int r,int now){int mid;while(l<=r){mid=(l+r)>>1;if(h2[now]-h2[now-mid]*poww[mid]==g2[now]-g2[now+mid]*poww[mid])l=mid+1;else r=mid-1;}return l-1;
}
int Binary22(int l,int r,int now){int mid;while(l<=r){mid=(l+r)>>1;if(h2[now]-h2[now-mid]*poww[mid]==g2[now+1]-g2[now+1+mid]*poww[mid])l=mid+1;else r=mid-1;}return l-1;
}
int Binary4(int l,int r,int nowl,int nowr){int mid;while(l<=r){mid=(l+r)>>1;if(h1[nowl]-h1[nowl-mid]*poww[mid]==g2[nowr]-g2[nowr+mid]*poww[mid])l=mid+1;else r=mid-1;}return l-1;
}
int main(){freopen("A.in","r",stdin);freopen("A.out","w",stdout);n=read();scanf(" %s %s",a+1,b+1);poww[0]=1;for(int i=1;i<=n;i++)h1[i]=h1[i-1]*base+a[i],h2[i]=h2[i-1]*base+b[i],poww[i]=poww[i-1]*base;for(int i=n;i>=1;i--)g1[i]=g1[i+1]*base+a[i],g2[i]=g2[i+1]*base+b[i];for(int i=1;i<=n;i++){len1[i]=Binary1(1,min(i,n-i+1),i),len11[i]=Binary11(1,min(i,n-i+1),i);ans=max(ans,max(len1[i]*2-1,len11[i]*2));}for(int i=1;i<=n;i++){len2[i]=Binary2(1,min(i,n-i+1),i),len22[i]=Binary22(1,min(i,n-i+1),i);ans=max(ans,max(len2[i]*2-1,len22[i]*2));}for(int i=1;i<=n;i++){ans=max(ans,len1[i]*2-1+Binary4(0,n-len1[i]-i+2,i-len1[i],i+len1[i]-1)*2);ans=max(ans,len11[i]*2+Binary4(0,n-len11[i]-i+1,i-len11[i],i+len11[i])*2);ans=max(ans,len2[i]*2-1+Binary4(0,n-len2[i]-i+1,i-len2[i]+1,i+len2[i])*2);ans=max(ans,len22[i]*2+Binary4(0,n-len22[i]-i+2,i-len22[i]+1,i+len22[i]+1)*2);}cout<<ans<<endl;return 0;
}

洛谷P4324 扭动的回文串相关推荐

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

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

  2. 洛谷P4287 [SHOI2011]双倍回文 题解

    洛谷P4287 [SHOI2011]双倍回文 题解 题目链接:P4287 [SHOI2011]双倍回文 题意: 记字符串 www 的倒置为 wRw^RwR .例如 (abcd)R=dcba(\tt{a ...

  3. [JSOI2016]扭动的回文串

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

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

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

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

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

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

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

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

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

  8. 【JSOI2016】扭动的回文串

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

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

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

最新文章

  1. 一文掌握机器学习必备数学知识(附学习资源)
  2. 编程之美-子数组之和的最大值(二维)方法整理
  3. php-cgi并发,对于php-fpm和cgi,还有并发响应的理解
  4. 供应商去市网维护银行账号信息_供应商信息中心是BBP系统中一项很重要的内容...
  5. Mate 30 不预装任何谷歌应用;阿里巴巴发布新“六脉神剑”;VS Code 1.38 发布 | 极客头条...
  6. centos7自带流量监控软件iftop
  7. 2022 年最佳 15 款网络监控工具
  8. SOTA级发丝抠图模型PP-Matting重磅开源,支持多场景精细化分割!
  9. android儿童模式 htc,HTC自家系统优化工具Boost+ 任何Android手机都可用
  10. vuecli添加和移除插件_『Clickteam Fusion插件开发基础』
  11. 快捷方式 java 桌面_创建桌面快捷方式
  12. 【学习随记】Gyro,Btn,filters_addClass
  13. 想成为一个Java软件工程师,谁能带我学一学?
  14. 问:全局变量是否可以定义在被多个.c文件包含的头文件.h中?
  15. pytohn 单下划线与双下划线的区别
  16. GitHub Desktop图文教程
  17. html表格翻页简单,利用jQuery实现一个简单的表格上下翻页效果
  18. HTML中来访时间,html记录用户的访问次数代码
  19. 【Python】 Python编程基础练习100题学习记录第七期(61~70)
  20. Webots简单自学笔记(随时更新)

热门文章

  1. star-rating评分插件的使用
  2. ADS解决xxxis an undefined model
  3. uoj #246. 【UER #7】套路
  4. 大数据统计大量股票开盘平均价和收盘平均价
  5. suunto android 跑步软件,SUUNTO APP | 自定义运动模式教程
  6. ASP.NET控件中回车自动跳转至下指定控件
  7. 没想到,中国邮政卖奶茶:一铺开就是全国第一
  8. Windows下的Program Files (x86)文件夹是干什么的?
  9. 如何使用Mock进行单元测试
  10. iphone6s计算机驱动,教你iphone6s连接电脑出现驱动问题怎么办及iOS9.0.2 App Store打不开问题的解决方法...