[BZOJ4755][JSOI2016]扭动的回文串(manacher+Hash)
前两种情况显然直接manacher,对于第三种,枚举回文中心,二分回文半径,哈希判断即可。
#include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
using namespace std; const int N=,P1=,P2=,P3=,P4=1e9+;
char A[N],B[N],s[N];
int n,ans,pw1[N],pw2[N],hsa1[N],hsa2[N],hsb1[N],hsb2[N],pa[N],pb[N]; int cal1(int l,int r,int hs[]){ return (hs[r]-1ll*hs[l-]*pw1[r-l+]%P2+P2)%P2; }
int cal2(int l,int r,int hs[]){ return (hs[r]-1ll*hs[l-]*pw2[r-l+]%P4+P4)%P4; } void manacher(char a[],int p[],int hs1[],int hs2[]){
s[]='$'; s[]='#'; int m=*n+,id=,mxl=;
rep(i,,n) s[*i]=a[i],s[*i+]='#';
rep(i,,m){
p[i]=(i<mxl) ? min(p[id*-i],mxl-i) : ;
while (s[i+p[i]]==s[i-p[i]]) p[i]++;
if (p[i]+i>mxl) mxl=p[i]+i,id=i;
ans=max(ans,p[i]-);
}
rep(i,,n){
hs1[i]=(1ll*hs1[i-]*P1+a[i]-'A')%P2;
hs2[i]=(1ll*hs2[i-]*P3+a[i]-'A')%P4;
}
} void work(char a[],int pa[],int hsa1[],int hsa2[],char b[],int pb[],int hsb1[],int hsb2[]){
rep(i,,n){
int t=pa[*i]/,L=t+,R=min(i,n-i+);
while (L<=R){
int mid=(L+R)>>;
if (cal1(i-mid+,i-t,hsa1)==cal1(n-(i+mid-)+,n-(i+t-)+,hsb1) && cal2(i-mid+,i-t,hsa2)==cal2(n-(i+mid-)+,n-(i+t-)+,hsb2))
ans=max(ans,mid*-),L=mid+; else R=mid-;
}
if (i==n) continue;
t=pa[*i+]/,L=t+,R=min(i,n-i);
while (L<=R){
int mid=(L+R)>>;
if (cal1(i-mid+,i-t,hsa1)==cal1(n-(i+mid-)+,n-(i+t)+,hsb1) && cal2(i-mid+,i-t,hsa2)==cal2(n-(i+mid-)+,n-(i+t)+,hsb2))
ans=max(ans,mid*),L=mid+; else R=mid-;
}
}
} int main(){
freopen("palindrome.in","r",stdin);
freopen("palindrome.out","w",stdout);
scanf("%d%s%s",&n,A+,B+); reverse(B+,B+n+);
pw1[]=pw2[]=;
rep(i,,n) pw1[i]=1ll*pw1[i-]*P1%P2,pw2[i]=1ll*pw2[i-]*P3%P4;
manacher(A,pa,hsa1,hsa2); manacher(B,pb,hsb1,hsb2);
work(A,pa,hsa1,hsa2,B,pb,hsb1,hsb2);
work(B,pb,hsb1,hsb2,A,pa,hsa1,hsa2);
printf("%d\n",ans);
return ;
}
[BZOJ4755][JSOI2016]扭动的回文串(manacher+Hash)的更多相关文章
- BZOJ4755: [JSOI2016]扭动的回文串——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4755 JYY有两个长度均为N的字符串A和B. 一个“扭动字符串S(i,j,k)由A中的第i个字符到 ...
- [bzoj4755][Jsoi2016]扭动的回文串
来自FallDream的博客,未经允许,请勿转载,谢谢. JYY有两个长度均为N的字符串A和B. 一个“扭动字符串S(i,j,k)由A中的第i个字符到第j个字符组成的子串与B中的第j个字符到第k个字符 ...
- BZOJ4755 [JSOI2016]扭动的回文串 【后缀数组】【manacher】
题目分析: 我写了史上最丑的后缀数组,怎么办? 首先manacher一遍两个串,这样只用考虑第三问.用$作为间隔符拼接两个串,把第一个串翻转.枚举回文中心,取最长的回文串,对于剩下的部分利用LCP匹配 ...
- BZOJ4755 JSOI2016扭动的回文串(二分答案+哈希)
显然答案应该是由单串以某位置为中心的极长回文串继续在另一个串里拓展得到的.枚举中间位置二分答案,哈希判断即可.注意考虑清楚怎么处理偶回文,比如像manacher一样加分隔符. #include< ...
- 【BZOJ4755】 [Jsoi2016]扭动的回文串
BZOJ4755 [Jsoi2016]扭动的回文串 Solution 考虑对于他给出的 A中的一个回文串: B中的一个回文串: 或者某一个回文的扭动字符串S(i,j,k) 这样子几个限制,我们1,2就 ...
- 【BZOJ4755】扭动的回文串(Manacher,哈希)
[BZOJ4755]扭动的回文串(Manacher,哈希) 题面 BZOJ 题解 不要真的以为看见了回文串就是\(PAM,Manacher\)一类就可以过. 这题显然不行啊. 我们主要考虑如何解决跨串 ...
- [BZOJ]4755: [Jsoi2016]扭动的回文串
Time Limit: 10 Sec Memory Limit: 512 MB Description JYY有两个长度均为N的字符串A和B. 一个"扭动字符串S(i,j,k)由A中的第i ...
- [JSOI2016]扭动的回文串
题目 非常板子了 看到求什么最长的回文,我们就想到枚举回文中心的方法 首先对于这个回文串只包含在一个串内的情况,我们随便一搞就可以了,大概\(Manacher\)一下就没有了 对于那种扭动的回文串,我 ...
- 【题解】Luogu P4324 [JSOI2016]扭动的回文串
原题传送门 这题实际挺水的 先对两个字符串分别跑马拉车 就能求出1.2类扭动回文串最大的长度 考虑第三类的扭动回文串\(S(i,j,k)\),一定可以表示为\(A(i,l)+A(l+1,j)+B(j, ...
随机推荐
- Redux遵循的三个原则是什么?
(1)单一事实来源: 整个应用的状态存储在单个 store 中的对象/状态树里.单一状态树可以更容易地跟踪随时间的变化,并调试或检查应用程序. (2)状态是只读的: 改变状态的唯一方法是去触发一个动作 ...
- Linux服务器下日志截取
我们经常需要去Linux服务器上查看服务运行日志,但是有时候日志文件很大看起来很不方便,这个时候我们需要对日志进行切割筛选出自己需要的日志,比如查看某段时间内的日志,命令如下: sed -n '/ ...
- https://docs.huihoo.com/infoq/qconbeijing/2016/day1/工程效率提升专题/2-2-支持百度万人开发的工具装备及百度工程能力建设-夏仲璞.pdf
https://docs.huihoo.com/infoq/qconbeijing/2016/day1/工程效率提升专题/2-2-支持百度万人开发的工具装备及百度工程能力建设-夏仲璞.pdf http ...
- MySQL按日期分组并统计截止当前时间的总数(实例教程)
MySQL按日期分组并统计截止当前时间的总数 建表语句 SET NAMES utf8mb4; ; -- ---------------------------- -- Table structure ...
- [原][OE][官方例子]osgearth_features OE地球添加shp文件(特征标识)
OE所有官方样例 官方示例代码 /* -*-c++-*- */ /* osgEarth - Dynamic map generation toolkit for OpenSceneGraph * Co ...
- 006-多线程-JUC线程池-并发测试程序
一.java代码模拟并发 1.1.一次并发 单次并发测试 1.使用CountDownLatch 等待一个或多个线程一起执行 详细参看:007-多线程-锁-JUC锁-CountDownLatch-闭锁[ ...
- Django中models定义的choices字典使用get_FooName_display()在页面中显示值
问题 在django的models.py 中,我们定义了一些choices的元组,类似一些字典值,一般都是下拉框或者单多选框,例如 0对应男 1对应女等等 看下例子: class Area(model ...
- intellij 插件的使用
目录 intellij 插件的使用 插件的设置 插件推荐 @(目录) intellij 插件的使用 插件的设置 在 IntelliJ IDEA 的安装讲解中我们其实已经知道,IntelliJ IDEA ...
- 【物联网】UI设计
https://designshidai.com/7337.html https://designshidai.com/24908.html http://www.qianqian-ye.com/sm ...
- 【k8s node断电重启】
kubernetes断电重启 导致部分pod无法删除 dashboard上处于黄色 kubectl get处于terminate 状态 kubectl delete报错: An error occur ...