题解

就是一个回文串拼上左右两端

类似二分找lcp这么做

可以直接用哈希找回文串

注意要找A串前半部分,B串找后半部分

代码

#include <bits/stdc++.h>
#define enter putchar('\n')
#define space putchar(' ')
#define pii pair<int,int>
#define fi first
#define se second
#define mp make_pair
#define MAXN 100005
#define mo 99994711
#define pb push_back
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) out(x / 10);
putchar('0' + x % 10);
}
int N;
char strA[MAXN],strB[MAXN];
int A[MAXN],B[MAXN],rev_A[MAXN],rev_B[MAXN],e[MAXN]; int mul(int a,int b) {
return 1LL * a * b % mo;
}
int inc(int a,int b) {
return a + b >= mo ? a + b - mo : a + b;
}
int check1(int *a,int l,int r) {
return mul(inc(a[r],mo - a[l - 1]),e[N - l]);
}
int check2(int *a,int l,int r) {
return mul(inc(a[l],mo - a[r + 1]),e[r - 1]);
}
int Find(int *f,int *b,int s,int t) {
if(s < 1 || t > N) return 0;
int L = 0,R = min(N - t + 1,s);
while(L < R) {
int mid = (L + R + 1) >> 1;
if(check1(f,s - mid + 1,s) == check2(b,t,t + mid - 1)) L = mid;
else R = mid - 1;
}
return L;
}
void update(int &x,int y) {
x = max(x,y);
}
void Solve() {
read(N);
scanf("%s%s",strA + 1,strB + 1);
e[0] = 1;
for(int i = 1 ; i <= N ; ++i) {
e[i] = mul(e[i - 1],47);
}
for(int i = 1 ; i <= N ; ++i) {
A[i] = mul(e[i - 1],strA[i] - 'A' + 1);
A[i] = inc(A[i],A[i - 1]);
B[i] = mul(e[i - 1],strB[i] - 'A' + 1);
B[i] = inc(B[i],B[i - 1]);
}
for(int i = N ; i >= 1 ; --i) {
rev_A[i] = mul(e[N - i],strA[i] - 'A' + 1);
rev_A[i] = inc(rev_A[i],rev_A[i + 1]);
rev_B[i] = mul(e[N - i],strB[i] - 'A' + 1);
rev_B[i] = inc(rev_B[i],rev_B[i + 1]);
}
int ans = 1;
for(int i = 2 ; i <= N - 1; ++i) {
int L = Find(A,rev_A,i - 1,i + 1);
int t = Find(A,rev_B,i - L - 1,i + L);
update(ans,2 * L + 2 * t + 1);
}
for(int i = 1 ; i <= N - 1 ; ++i) {
int L = Find(A,rev_A,i,i + 1);
int t = Find(A,rev_B,i - L,i + L);
update(ans,2 * L + 2 * t);
}
for(int i = 2 ; i <= N - 1; ++i) {
int L = Find(B,rev_B,i - 1,i + 1);
int t = Find(A,rev_B,i - L,i + L + 1);
update(ans,2 * L + 2 * t + 1);
}
for(int i = 1 ; i <= N - 1; ++i) {
int L = Find(B,rev_B,i,i + 1);
int t = Find(A,rev_B,i - L + 1,i + L + 1);
update(ans,2 * L + 2 * t);
}
out(ans);enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
return 0;
}

【LOJ】#2073. 「JSOI2016」扭动的回文串的更多相关文章

  1. loj2073 「JSOI2016」扭动的回文串

    ref 主要是要理解"撑到"最长这个概念 (为啥我的代码这么长QAQ #include <iostream> #include <cstdio> using ...

  2. loj#2071. 「JSOI2016」最佳团体

    题目链接 loj#2071. 「JSOI2016」最佳团体 题解 树形dp强行01分规 代码 #include<cstdio> #include<cstring> #inclu ...

  3. loj#2076. 「JSOI2016」炸弹攻击 模拟退火

    目录 题目链接 题解 代码 题目链接 loj#2076. 「JSOI2016」炸弹攻击 题解 模拟退火 退火时,由于答案比较小,但是温度比较高 所以在算exp时最好把相差的点数乘以一个常数让选取更差的 ...

  4. [LOJ 2082] 「JSOI2016」炸弹攻击 2

    [LOJ 2082] 「JSOI2016」炸弹攻击 2 链接 链接 题解 枚举发射源,将发射源当做原点,对敌人和激光塔极角排序. 由于敌人纵坐标均为正,而其它点均为负,因此每两个角度差在 \(\pi\ ...

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

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

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

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

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

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

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

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

  9. [JSOI2016]扭动的回文串

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

随机推荐

  1. Java 基本数据类型 sizeof 功能

    Java 基本数据类型 sizeof 功能 来源 https://blog.csdn.net/ithomer/article/details/7310008 Java基本数据类型int     32b ...

  2. c++11 追踪返回类型

    c++11 追踪返回类型 返回类型后置:使用"->"符号,在函数名和参数列表后面指定返回类型. #define _CRT_SECURE_NO_WARNINGS #includ ...

  3. 'sudo'不是内部或外部命令,,,,的解决办法

    [说明] Windows系统从 Vista 版本开始加入了 UAC 机制,这导致没有足够权限的程序无法获取到一些关键资源.在 Linux 下我们可以使用 sudo 命令方便地提升当前程序的执行权限,但 ...

  4. 手动生成moc文件

    在VS中写Qt项目时,手动添加了一个类,由于要用到信号槽,所以需要生成相应的moc文件.写好信号槽以后,在类里面第一行应该写上Q_OBJECT关键字,编译项目会提示无法找到moc_XXX.cpp文件. ...

  5. Intel 8086_通用寄存器|段寄存器

  6. NB-IoT 的“前世今生”

    作者:个推B2D研发工程师 海晏 根据<爱立信2018移动报告>(Ericsson Mobility Report,June 2018)的预测,蜂窝物联网设备连接数将在2023年达到35亿 ...

  7. Java模拟http请求远程调用接口工具类

    package ln; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamRea ...

  8. python---补充django中文报错(2),Django3.5出错

    今天是要Django3.5设置项目,结果出现中文报错,虽然之前分析过py2.7的报错原因,但是在py3之后reload不在使用,需要引入: from importlib import reload 但 ...

  9. SQL记录-Linux CentOS配置ORACLE 12c

    1.准备LIINX软件包 操作系统:centos7 虚拟机:VMware 12 JDK:1.8 数据库:oracle 12c 2.配置基础环境 2.1 部署虚拟机VM(过程略) 2.2 部署操作系统C ...

  10. [整理]Error: [ngRepeat:dupes]的解决方法

    sdfsadf <div class="pageNum middle PT10"> <a href="javascript:void(0);" ...