【LOJ】#2073. 「JSOI2016」扭动的回文串
题解
就是一个回文串拼上左右两端
类似二分找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」扭动的回文串的更多相关文章
- loj2073 「JSOI2016」扭动的回文串
ref 主要是要理解"撑到"最长这个概念 (为啥我的代码这么长QAQ #include <iostream> #include <cstdio> using ...
- loj#2071. 「JSOI2016」最佳团体
题目链接 loj#2071. 「JSOI2016」最佳团体 题解 树形dp强行01分规 代码 #include<cstdio> #include<cstring> #inclu ...
- loj#2076. 「JSOI2016」炸弹攻击 模拟退火
目录 题目链接 题解 代码 题目链接 loj#2076. 「JSOI2016」炸弹攻击 题解 模拟退火 退火时,由于答案比较小,但是温度比较高 所以在算exp时最好把相差的点数乘以一个常数让选取更差的 ...
- [LOJ 2082] 「JSOI2016」炸弹攻击 2
[LOJ 2082] 「JSOI2016」炸弹攻击 2 链接 链接 题解 枚举发射源,将发射源当做原点,对敌人和激光塔极角排序. 由于敌人纵坐标均为正,而其它点均为负,因此每两个角度差在 \(\pi\ ...
- 【BZOJ4755】 [Jsoi2016]扭动的回文串
BZOJ4755 [Jsoi2016]扭动的回文串 Solution 考虑对于他给出的 A中的一个回文串: B中的一个回文串: 或者某一个回文的扭动字符串S(i,j,k) 这样子几个限制,我们1,2就 ...
- [BZOJ]4755: [Jsoi2016]扭动的回文串
Time Limit: 10 Sec Memory Limit: 512 MB Description 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个字符 ...
- 【题解】Luogu P4324 [JSOI2016]扭动的回文串
原题传送门 这题实际挺水的 先对两个字符串分别跑马拉车 就能求出1.2类扭动回文串最大的长度 考虑第三类的扭动回文串\(S(i,j,k)\),一定可以表示为\(A(i,l)+A(l+1,j)+B(j, ...
- [JSOI2016]扭动的回文串
题目 非常板子了 看到求什么最长的回文,我们就想到枚举回文中心的方法 首先对于这个回文串只包含在一个串内的情况,我们随便一搞就可以了,大概\(Manacher\)一下就没有了 对于那种扭动的回文串,我 ...
随机推荐
- CRM 常用SQL 脚本
1. 查询角色.用户 SELECT DISTINCT DomainName, u.FullName , u.FirstName, u.InternalEM ...
- Github Desktop 克隆仓库一直出现“Authentication failed”
如图所示: 解决方法: 使用ssh链接下载而不是https
- Go 语言中的方法,接口和嵌入类型
https://studygolang.com/articles/1113 概述 在 Go 语言中,如果一个结构体和一个嵌入字段同时实现了相同的接口会发生什么呢?我们猜一下,可能有两个问题: 编译器会 ...
- 解题:CF1130E Wrong Answer
题面 巧妙构造题 这种题一定要限制一个条件,使得在这个条件下能推出要叉的代码的式子 令序列$a$的第一个元素为负,其余元素为正,且保证序列中至少有两个元素,那么Alice的代码将会从第二个元素开始计算 ...
- Advanced RESTClient插件安装 google浏览器
在csdn下载插件,并解压. 然后在设置里找到扩展程序,打开并开启开发者模式,加载你刚刚解压的插件就可以. 我是用了蓝灯打开google的,成功后这样的
- VMware Workstation 12序列号:
VMware Workstation 12序列号: 5A02H-AU243-TZJ49-GTC7K-3C61N
- 解决 django 博客归档 “Are time zone definitions for your database and pytz installed?”的错误
修改 project 中的settings 文件,问题解决! # USE_TZ = True USE_TZ = False # LANGUAGE_CODE = 'en-us' LANGUAGE_COD ...
- java精确除法运算(BigDecimal)
除法运算的函数定义如下 BigDecimal.divide(BigDecimal divisor, int scale, RoundingMode roundingMode) ; scale为小数位数 ...
- 前三章 man手册 查看文件
1 – 3章 1.1 man手册: 分1 - 9个区域,可以认为是一个一个小节 把man手册理解为一本书 第一节:可执行程序或shell命令 第二节:系统调用 第三节:库调用 第四节:特殊文件 第五节 ...
- ASP.NET真假分页—真分页
当数据量过大,有几万甚至十几万条数据时,每次都从数据库中取出所有数据就会降低查询效率,系统运行慢,还有可能卡死,这时假分页就会显得很不人性化,因此有了真分页的必要性. 正如上篇博文总结归纳,“真”相对 ...