显然答案应该是由单串以某位置为中心的极长回文串继续在另一个串里拓展得到的。枚举中间位置二分答案,哈希判断即可。注意考虑清楚怎么处理偶回文,比如像manacher一样加分隔符。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 200010
#define ul unsigned long long
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,ans;
ul ha[N],rha[N],hb[N],rhb[N],p[N];
char a[N],b[N],s1[N],s2[N];
ul hash(ul *a,int l,int r,int op)
{
return a[r]-a[l-op]*p[abs(r-l)+];
}
void solve(ul *a,ul *ra,ul *b,ul *rb,int op,int n)
{
for (int i=;i<=n;i++)
{
int l=,r=min(n-i,i-),len=;
while (l<=r)
{
int mid=l+r>>;
if (hash(a,i-mid,i,)==hash(ra,i+mid,i,-)) len=mid,l=mid+;
else r=mid-;
}
ans=max(ans,len);
l=,r=min(i-len+,n-i-len);
while (l<=r)
{
int mid=l+r>>;
if (op?hash(b,i-len-mid+,i-len,)==hash(ra,i+len+mid,i+len+,-):hash(a,i-len-mid,i-len-,)==hash(rb,i+len+mid-,i+len,-)) ans=max(ans,len+mid),l=mid+;
else r=mid-;
}
}
}
void work(int n)
{
n=n*+;
for (int i=;i<=n;i++) ha[i]=ha[i-]*+a[i];
for (int i=n;i>=;i--) rha[i]=rha[i+]*+a[i];
for (int i=;i<=n;i++) hb[i]=hb[i-]*+b[i];
for (int i=n;i>=;i--) rhb[i]=rhb[i+]*+b[i];
p[]=;for (int i=;i<=n;i++) p[i]=p[i-]*;
solve(ha,rha,hb,rhb,,n),solve(hb,rhb,ha,rha,,n);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj4755.in","r",stdin);
freopen("bzoj4755.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read();
scanf("%s",s1+),scanf("%s",s2+);
for (int i=n;i>=;i--) a[i*+]='$',a[i*+]=s1[i];a[]='$';a[]='#';
for (int i=n;i>=;i--) b[i*+]='$',b[i*]=s2[i];b[]='$';b[n*+]='@';
work(n);
for (int i=n;i>=;i--) a[i*+]='$',a[i*]=s1[i];a[]='$';a[n*+]='@';
for (int i=n;i>=;i--) b[i*+]='$',b[i*+]=s2[i];b[]='$';b[]='#';
work(n);
cout<<ans;
return ;
}

BZOJ4755 JSOI2016扭动的回文串(二分答案+哈希)的更多相关文章

  1. [bzoj4755][Jsoi2016]扭动的回文串

    来自FallDream的博客,未经允许,请勿转载,谢谢. JYY有两个长度均为N的字符串A和B. 一个“扭动字符串S(i,j,k)由A中的第i个字符到第j个字符组成的子串与B中的第j个字符到第k个字符 ...

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

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

  3. BZOJ4755 [JSOI2016]扭动的回文串 【后缀数组】【manacher】

    题目分析: 我写了史上最丑的后缀数组,怎么办? 首先manacher一遍两个串,这样只用考虑第三问.用$作为间隔符拼接两个串,把第一个串翻转.枚举回文中心,取最长的回文串,对于剩下的部分利用LCP匹配 ...

  4. [BZOJ4755][JSOI2016]扭动的回文串(manacher+Hash)

    前两种情况显然直接manacher,对于第三种,枚举回文中心,二分回文半径,哈希判断即可. #include<cstdio> #include<algorithm> #defi ...

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

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

  6. 【BZOJ4755】扭动的回文串(Manacher,哈希)

    [BZOJ4755]扭动的回文串(Manacher,哈希) 题面 BZOJ 题解 不要真的以为看见了回文串就是\(PAM,Manacher\)一类就可以过. 这题显然不行啊. 我们主要考虑如何解决跨串 ...

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

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

  8. 【题解】Luogu P4324 [JSOI2016]扭动的回文串

    原题传送门 这题实际挺水的 先对两个字符串分别跑马拉车 就能求出1.2类扭动回文串最大的长度 考虑第三类的扭动回文串\(S(i,j,k)\),一定可以表示为\(A(i,l)+A(l+1,j)+B(j, ...

  9. [JSOI2016]扭动的回文串

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

随机推荐

  1. BZOJ2600_ricehub_KEY

    题目传送门 这道题一开始我还以为是贪心,sort一遍直接取中点然后求最优值. 但写了之后才发现错误,设置的谷仓只要是一段区间的中点即可.这段区间的两端一定是两片谷田. 所以枚举区间的左端点,二分右端点 ...

  2. Android 模拟器 下载、编译及调试

    Android 模拟器源码下载 Android 模拟器源码的下载与 Android AOSP 源码库的下载过程类似,可以参考 Google 官方提供的 Android 源码下载文档 来了解这个过程. ...

  3. js 中常用到的封装方法

    /** * 获取URL参数 */ function getQueryString(name) { var reg = new RegExp("(^|&)" + name + ...

  4. lintcode413 反转整数

    反转整数   将一个整数中的数字进行颠倒,当颠倒后的整数溢出时,返回 0 (标记为 32 位整数). 您在真实的面试中是否遇到过这个题? Yes 样例 给定 x = 123,返回 321 给定 x = ...

  5. 代码对齐 (Alignment of Code,ACM/ICPC NEERC 2010,UVa1593)

    题目描述: 解题思路: 输入时提出单个字符串,并用一个数组记录每列最长长度,格式化输出 #include <iostream> #include <algorithm> #in ...

  6. org.apache.spark.sql.functions汇总

    测试数据: id,name,age,comment,date 1,lyy,28,"aaa bbb",20180102020325 scala> var data = spar ...

  7. 关于TensorFlow的GPU设置

    摘自:https://blog.csdn.net/byron123456sfsfsfa/article/details/79811286 1.  在使用GPU版的TensorFlow跑程序的时候,如果 ...

  8. 简单构建基于RDF和SPARQL的KBQA(知识图谱问答系统)

    本文主要通过python实例讲解基于RDF和SPARQL的KBQA系统的构建.该项目可在python2和python3上运行通过. 注:KBQA即是我们通常所说的基于知识图谱的问答系统.这里简单构建的 ...

  9. vue.js学习之 如何在手机上查看vue-cli构建的项目

    vue.js学习之 如何在手机上查看vue-cli构建的项目 一:找到config文件夹下的index.js文件,打开后,将host的值改为你本地的ip,保存后重启项目 二:输入ip和端口号打开项目 ...

  10. 一步步学敏捷开发:1、敏捷开发及Scrum介绍

    敏捷开发之 历史背景 20世纪60年代:软件作坊,软件规模小,以作坊式开发为主:70年代:软件危机,硬件飞速发展,软件规模和复杂度激增,引发软件危机:80年代:软件过程控制,引入成熟生产制造管理方法, ...