传送门

对\(A\)、\(B\)串各跑一遍\(manacher\),求出第\(1\)、\(2\)类扭动回文串的最大长度。

考虑第三类的扭动回文串\(S(i,j,k)\),一定可以表示为\(A(i,l)+A(l+1,j)+B(j,k)\)或\(A(i,j)+B(j,l)+B(l+1,k)\),其中,第一段与第三段对称(第一段正着\(Hash\)和第三段反着\(Hash\)相同),第二段是一个回文子串,三段都可以是空串。

我们可以分别在\(AB\)上枚举对称中心,然后感性理解一下发现肯定是取以该对称中心为中心的最长回文串作为中间那段是最优的。然后对于第一段和第三段分别二分其长度就好了

//minamoto
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
inline char gc(){char ch;while((ch=getc())<'A'||ch>'Z');return ch;}
const int N=2e5+5,P1=1e9+7,P2=998244353;
int a[N],b[N],sum[N][2],num[N][2],bin[N][2],f[N],g[N];
int n,m,ans,p,l,r;char ch;
bool ck(int l1,int r1,int l2,int r2){int x,y;x=(sum[r1][0]-1ll*sum[l1-1][0]*bin[r1-l1+1][0]%P1)%P1;y=(num[l2][0]-1ll*num[r2+1][0]*bin[r2-l2+1][0]%P1)%P1;x=(x+P1)%P1,y=(y+P1)%P1;if(x!=y)return false;x=(sum[r1][1]-1ll*sum[l1-1][1]*bin[r1-l1+1][1]%P2)%P2;y=(num[l2][1]-1ll*num[r2+1][1]*bin[r2-l2+1][1]%P2)%P2;x=(x+P2)%P2,y=(y+P2)%P2;return x==y;
}
int calc(int j,int k){int l=0,r=min(j,n-k+1),res=0;while(l<=r){int mid=(l+r)>>1;if(ck(j-mid+1,j,k,k+mid-1))res=mid,l=mid+1;else r=mid-1;}return res;
}
int main(){
//  freopen("testdata.in","r",stdin);scanf("%d",&n);bin[0][0]=bin[0][1]=1;fp(i,1,n)bin[i][0]=1ll*bin[i-1][0]*27%P1,bin[i][1]=1ll*bin[i-1][1]*27%P2;a[0]=b[0]=0,a[n*2+2]=b[n*2+2]=28,a[1]=b[1]=27;fp(i,1,n)ch=gc(),a[i*2]=ch-'A'+1,a[i*2+1]=27;fp(i,1,n)ch=gc(),b[i*2]=ch-'A'+1,b[i*2+1]=27;p=0;fp(i,2,n*2){if(i<=p+f[p])f[i]=min(f[2*p-i],p+f[p]-i);while(a[i-f[i]-1]==a[i+f[i]+1])++f[i];if(i+f[i]>p+f[p])p=i;}p=0;fp(i,2,n*2){if(i<=p+g[p])g[i]=min(g[2*p-i],p+g[p]-i);while(b[i-g[i]-1]==b[i+g[i]+1])++g[i];if(i+g[i]>p+g[p])p=i;}fp(i,2,n*2)cmax(ans,max(f[i],g[i]));fp(i,1,n){sum[i][0]=(1ll*sum[i-1][0]*27%P1+a[i*2])%P1;sum[i][1]=(1ll*sum[i-1][1]*27%P2+a[i*2])%P2;}fd(i,n,1){num[i][0]=(1ll*num[i+1][0]*27%P1+b[i*2])%P1;num[i][1]=(1ll*num[i+1][1]*27%P2+b[i*2])%P2;}fp(i,2,n*2){l=(i-f[i]+1)>>1,r=(i+f[i])>>1;cmax(ans,f[i]+calc(l-1,r)*2);l=(i-g[i]+1)>>1,r=(i+g[i])>>1;cmax(ans,g[i]+calc(l,r+1)*2);}printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/bztMinamoto/p/10107707.html

P4324 [JSOI2016]扭动的回文串相关推荐

  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. 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. [JSOI2016]扭动的回文串

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

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

    标签:Manacher,hash,二分 题目 题目传送门 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. [BZOJ]4755: [Jsoi2016]扭动的回文串

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

  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. java项目经理也就那么回事_网易PM | 我们之前在需求评审环节踩过的坑...
  2. 九度OJ 1336:液晶屏裁剪 (GCD)
  3. nyoj 762:第k个互质数
  4. jlink v9可升级固件‘_STM32WB的硬核功能 - 无线固件升级FUOTA
  5. 【bzoj4195】[Noi2015]程序自动分析 离散化+并查集
  6. 海归计算机专业简历怎么写,海归硕士求职简历该怎么写?
  7. python自带模块连接数据库_Python使用sqlalchemy模块连接数据库操作示例
  8. 「开源资讯」Apache Storm 2.2.0 发布,分布式实时计算
  9. Word写论文及PPT画论文图的经验总结
  10. CTFHUB刷题 密码口令/默认口令
  11. 大学c语言机试是老师阅卷么,最近,我们找了一些老师聊了聊
  12. ecshop 添加会员头像功能
  13. 星辰变java镇东王府在哪里_星辰变中让人非常失望的四位高手,最后一位只动口不出手!...
  14. 有没有压缩视频的软件?能压缩视频的软件?压缩视频用什么软件比较好?
  15. Jenkins + 云效 前后端项目自动化部署
  16. [Apple Shapr3D]【续更】【shapr3D】认识Shapr3D,一个简单易用的设计类软件
  17. linux系统修改ip地址教程。
  18. ios 计算两个时间相差秒数_iOS NSDate时间换算
  19. 名悦集团分享那些省钱又简单的汽车保养妙招
  20. NeuroImage:脑网络分析揭示社交焦虑症患者的大脑功能环路异常

热门文章

  1. jQuery .attr(checked)得undefined 问题解决
  2. iOS WKWebView ios9以上版本配置 与 设置UserAgent(用户代理), 解决点击web, 客户端接收不到web事件问题...
  3. 数据库中关于convert的参数学习(转化函数用法)
  4. libgdx学习记录18——Box2d物理引擎
  5. 杯具,丢失了一部分邮件
  6. Kubernetes之深入了解Pod
  7. FPGA:下一代机器人感知处理器
  8. ios图像处理第2部分:核心图形,核心图像,GPUImage
  9. 第九章:路由网关(Zuul)的使用
  10. 消息队列的四大典型使用场景