ref

主要是要理解“撑到“最长这个概念

(为啥我的代码这么长QAQ

#include <iostream>
#include <cstdio>
using namespace std;
typedef unsigned long long ull;
int n, pa[200005], pb[200005], ans;
ull bse1[200005], bse2[200005], hsa1[200005], hsa2[200005], hsb1[200005];
ull hsb2[200005];
const int mod1=19260817, mod2=1e9+7;
char sa[200005], sb[200005];
bool iseq(int a, int b, int c, int d){
if(a>b) return true;
ull sa1=0, sb1=0;
if(a)
sa1 = hsa1[a-1] * bse1[b-a+1] % mod1;
sa1 = (hsa1[b] - sa1 + mod1) % mod1;
if(d!=n-1)
sb1 = hsb1[d+1] * bse1[d-c+1] % mod1;
sb1 = (hsb1[c] - sb1 + mod1) % mod1;
if(sa1!=sb1) return false;
sa1 = sb1 = 0;
if(a)
sa1 = hsa2[a-1] * bse2[b-a+1] % mod2;
sa1 = (hsa2[b] - sa1 + mod2) % mod2;
if(d!=n-1)
sb1 = hsb2[d+1] * bse2[d-c+1] % mod2;
sb1 = (hsb2[c] - sb1 + mod2) % mod2;
if(sa1!=sb1) return false;
return true;
}
void manacher(char a[], int b[]){
int id=0, mx=0;
for(int i=1; i<n; i++){
if(i<mx) b[i] = min(b[2*id-i], mx-i);
else b[i] = 1;
while(a[i-b[i]]==a[i+b[i]]) b[i]++;
if(mx<i+b[i]) mx = i + b[i], id = i;
ans = max(ans, b[i]);
}
}
int main(){
cin>>n;
scanf("%s", sa);
scanf("%s", sb);
for(int i=n; i>=0; i--){
sa[2*i+1] = '#';
sa[2*i+2] = sa[i];
}
for(int i=n; i>=0; i--){
sb[2*i+1] = '#';
sb[2*i+2] = sb[i];
}
sa[0] = sb[0] = '$';
n = 2 * (n + 1);
bse1[0] = bse2[0] = 1;
for(int i=1; i<n; i++){
bse1[i] = bse1[i-1] * 131 % mod1;
bse2[i] = bse2[i-1] * 131 % mod2;
}
ull ff=0;
for(int i=0; i<n; i++){
ff = (ff * 131 % mod1 + sa[i]) % mod1;
hsa1[i] = ff;
}
ff = 0;
for(int i=0; i<n; i++){
ff = (ff * 131 % mod2 + sa[i]) % mod2;
hsa2[i] = ff;
}
ff = 0;
for(int i=n-1; i>=0; i--){
ff = (ff * 131 % mod1 + sb[i]) % mod1;
hsb1[i] = ff;
}
ff = 0;
for(int i=n-1; i>=0; i--){
ff = (ff * 131 % mod2 + sb[i]) % mod2;
hsb2[i] = ff;
}
manacher(sa, pa);
manacher(sb, pb);
ans--;
for(int i=1; i<n; i++){
int pos1=i-pa[i], pos2=i+pa[i]-2;
int l=0, r=min(pos1, n-pos2), mid, re;
while(l<=r){
mid = (l + r) >> 1;
if(iseq(pos1-mid+1, pos1, pos2, pos2+mid-1))
re = mid, l = mid + 1;
else r = mid - 1;
}
ans = max(ans, pa[i]+re-1);
}
for(int i=1; i<n; i++){
int pos1=i-pb[i]+2, pos2=i+pb[i];
int l=0, r=min(pos1, n-pos2), mid, re;
while(l<=r){
mid = (l + r) >> 1;
if(iseq(pos1-mid+1, pos1, pos2, pos2+mid-1))
re = mid, l = mid + 1;
else r = mid - 1;
}
ans = max(ans, pb[i]+re-1);
}
cout<<ans<<endl;
return 0;
}

loj2073 「JSOI2016」扭动的回文串的更多相关文章

  1. 【LOJ】#2073. 「JSOI2016」扭动的回文串

    题解 就是一个回文串拼上左右两端 类似二分找lcp这么做 可以直接用哈希找回文串 注意要找A串前半部分,B串找后半部分 代码 #include <bits/stdc++.h> #defin ...

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

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

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

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

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

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

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

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

  6. [JSOI2016]扭动的回文串

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

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

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

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

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

  9. 非确定性有穷状态决策自动机练习题Vol.1 A.扭动的回文串

    非确定性有穷状态决策自动机练习题Vol.1 A.扭动的回文串 题目描述 \(JYY\)有两个长度均为\(N\)的字符串\(A\)和\(B\). 一个"扭动字符串\(S(i,j,k)\)由\( ...

随机推荐

  1. swagger + springboot

    参考文章:  https://blog.csdn.net/xupeng874395012/article/details/68946676/ https://blog.csdn.net/hry2015 ...

  2. 转载 tomcat6下项目移植到tomcat7下出问题的解决办法

    转载,原文地址  http://hw1287789687.iteye.com/blog/1817865 org.apache.catalina.core.ContainerBase addChildI ...

  3. ajax请求总是返回error的问题

    多半是因为返回值格式的问题,在后台返回的应与前台设定的值一直,不然就会进入error,会报404服务器错误,极有可能是后台返回的数据类型不对 public void exitSystem( HttpS ...

  4. 爬虫基础-http请求的基础知识

    百度百科上这么介绍爬虫: 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本. 在开发爬虫时常用的工具:ch ...

  5. POJ2112 Optimal Milking---二分+Floyd+网络流

    题目链接: https://vjudge.net/problem/POJ-2112 题目大意: k个机器,每个机器最多服务m头牛. c头牛,每个牛需要1台机器来服务. 告诉你牛与机器每个之间的直接距离 ...

  6. js清空表单数据的方式(遍历+reset)

    方法1:遍历页面元素 /* 清空FORM表单内容 id:表单ID*/ function ClearForm(id) { var objId = document.getElementById(id); ...

  7. AOSP常见漏洞类型简介

    Heap/Stack Overflow(CVE-2017-0541) 漏洞出现在PushcdlStack函数中,如下所示   # /external/sonivox/arm-wt-22k/lib_sr ...

  8. Solaris&&QNX® Neutrino®&&OpenVMS&&FreeBSD&&AIX

    原文链接Solaris (读作 /se'laris:/ 或者 /so'le:ris/ 或者 '梭拉瑞斯' )是Sun Microsystems研发的计算机 操作系统.它被认为是UNIX操作系统的衍生版 ...

  9. c++ 循环程序的作业,2017年10月10日作业题。

    作业1: 需求:输出一个由 * 符号所组成的矩形,要求每行有50个 * ,一共需要有60行.使用双重for循环完成. 作业2: 需求:输出一个由 * 符号所组成的三角形,要求第一行一个 * ,第二行 ...

  10. nodejs实现前后端交互

    本人nodejs入门级选手,站在巨人(文殊)的肩膀上学习了一些相关知识,有幸在项目中使用nodejs实现了前后端交互,因此,将整个交互过程记录下来,方便以后学习. 本文从宏观讲述nodejs实现前后端 ...