题解

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

类似二分找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. MT【95】由参数前系数凑配系数题2

    提示:都是看$a,b$前的系数做的$a=4/3,b=2/3;a+b=\le2$,一样的可以求得$a+b$的最小值-1,当$b=\frac{1}{3},a=\frac{-4}{3}$时取到等号.此题是清 ...

  2. js判断checkbox是否选中

    $('.div0 .checkbox1').prop('checked')选中返回 true未选中返回 false $('.div0').prop("checked", true) ...

  3. [IOI2018] werewolf 狼人

    [IOI2018] werewolf 狼人 IOI2018题解 (其实原题强制在线,要用主席树) 代码: 注意: 1.下标从0~n-1 2.kruskal重构树开始有n个节点,tot从n开始,++to ...

  4. Java中如何遍历Map对象

    方法一:使用map.entrySet()来遍历.这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要的时候使用. Map<String,String> map = new Ha ...

  5. Asp.net MVC3 CSS 模板

    http://www.cnblogs.com/huyq2002/archive/2011/12/16/2289795.html Asp.net MVC3 CSS 模板 如果你现在正在用asp.net ...

  6. Docker下的Spring Cloud三部曲之一:极速体验

    版权声明:欢迎转载,请注明出处,谢谢. http://blog.csdn.net/boling_cavalry/article/details/79177930   目录(?)[+]   从本章开始, ...

  7. Eclipse的一些常用的快捷键

    写代码的时候常用的: Ctrl + 鼠标左键: 进入函数定义,变量声明: Alt + ←: 回到上次编辑的地方, 同理 Alt + → 可以移回来 Ctrl + O: 查找当前类的所有函数,变量 Ct ...

  8. bzoj千题计划184:bzoj1261: [SCOI2006]zh_tree

    http://www.lydsy.com/JudgeOnline/problem.php?id=1261 dp[l][r][dep]  区间[l,r]内的节点,根在dep层的最小代价 枚举根i,dp[ ...

  9. Spring RedisTemplate操作-HyperLogLog操作(7)

    @Autowired @Resource(name="redisTemplate") private RedisTemplate<String, String> rt; ...

  10. ASP.NET批量下载文件

    一.实现步骤 在用户操作界面,由用户选择需要下载的文件,系统根据所选文件,在服务器上创建用于存储所选文件的临时文件夹,将所选文件拷贝至临时文件夹.然后调用 RAR程序,对临时文件夹进行压缩,然后输出到 ...