bzoj4755: [Jsoi2016]扭动的回文串

Description

JYY有两个长度均为N的字符串A和B。
一个“扭动字符串S(i,j,k)由A中的第i个字符到第j个字符组成的子串
与B中的第j个字符到第k个字符组成的子串拼接而成。
比如,若A=’XYZ’,B=’UVW’,则扭动字符串S(1,2,3)=’XYVW’。
JYY定义一个“扭动的回文串”为如下情况中的一个:
1.A中的一个回文串;
2.B中的一个回文串;
3.或者某一个回文的扭动字符串S(i,j,k)
现在JYY希望找出最长的扭动回文串。

Input

第一行包含一个正整数N。
第二行包含一个长度为N的由大写字母组成的字符串A。
第三行包含一个长度为N的由大写字母组成的字符串B。
1≤N≤10^5。

Output

输出的第一行一个整数,表示最长的扭动回文串。

Sample Input

5
ABCDE
BAECB

Sample Output

5
最佳方案中的扭动回文串如下所示(不在回文串中的字符用.表示):
.BC..
..ECB

分析

设扭动的回文串为M(i,j)M(i,j)M(i,j),则
M(i,j)=Sa(i,k)+Paorb(k,l)+Sb(l,j)M(i,j)=Sa(i,k)+Paorb(k,l)+Sb(l,j)M(i,j)=S_a(i,k)+P_{a\, or \, b}(k,l)+S_b(l,j)
其中Paorb(k,l)Paorb(k,l)P_{a\, or \, b}(k,l)是关于某个中心点的最长的回文串,(k,l)(k,l)(k,l)区间的开闭由其是在A串还是B串中决定。Sa(i,k),Sb(l,j)Sa(i,k),Sb(l,j)S_a(i,k),S_b(l,j)是反对称的。
然后对于A和B中的每个对称中心,我们manacher一遍求出Paorb(k,l)Paorb(k,l)P_{a\, or \, b}(k,l),两边二分+Hash即可。

代码

/**************************************************************Problem: 4755User: 2014lvzelongLanguage: C++Result: AcceptedTime:704 msMemory:4808 kb
****************************************************************/#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N = 1e5 + 10;
unsigned long long se = 31;
char s[N << 1], a[N], b[N];
int n, f[N << 1], ans;
unsigned long long ha[N], hb[N], bin[N];
void Solve(char *S) {s[0] = '.'; int id = 0, tot = 0;for(int i = 1;i <= n; ++i) {s[++tot] = S[i];if(i != n) s[++tot] = '#';}for(int i = 1;i <= tot; ++i) {if(i < id + f[id]) f[i] = min(id + f[id] - i, f[(id << 1) - i]);else f[i] = 0;while(s[i - f[i] - 1] == s[i + f[i] + 1]) ++f[i];if(i + f[i] > id + f[id]) id = i;int L = i - f[i] + 2 >> 1, R = i + f[i] + 1 >> 1;if(S == a) --R; else ++L; int res = 0;for(int l = 0, r = min(L - 1, n - R); l <= r; ) {int mid = l + r >> 1;if(ha[L - 1] - ha[L - mid - 1] * bin[mid] == hb[R + 1] - hb[R + mid + 1] * bin[mid])res = mid, l = mid + 1;else r = mid - 1;}ans = max(ans, R - L + 2 + (res << 1));}
}int main() {scanf("%d%s%s", &n, a + 1, b + 1);bin[0] = 1; for(int i = 1;i <= n; ++i) bin[i] = bin[i - 1] * se;for(int i = 1;i <= n; ++i) ha[i] = ha[i - 1] * se + a[i];for(int i = n; i; --i) hb[i] = hb[i + 1] * se + b[i];Solve(a); Solve(b);printf("%d\n", ans);return 0;
}


bzoj4755: [Jsoi2016]扭动的回文串 manacher+二分+Hash相关推荐

  1. 洛谷 P4324 [JSOI2016]扭动的回文串 manacher+字符串hash

    题目描述 JYY有两个长度均为 NNN 的字符串 AAA 和 BBB. 一个扭动字符串 S(i,j,k)S(i,j,k)S(i,j,k) 由 AAA 中的第 iii 个字符到第 jjj 个字符组成的子 ...

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

    标签:Manacher,hash,二分 题目 题目传送门 Description JYY有两个长度均为N的字符串A和B. 一个"扭动字符串S(i,j,k)由A中的第i个字符到第j个字符组成的 ...

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

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

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

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

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

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

  6. [JSOI2016]扭动的回文串

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

  7. bzoj 4755: [Jsoi2016]扭动的回文串 manachar+hash+二分

    题意 JYY有两个长度均为N的字符串A和B. 一个"扭动字符串S(i,j,k)由A中的第i个字符到第j个字符组成的子串与B中的第j个字符到第k个字符组成的子串拼接而成. 比如,若A='XYZ ...

  8. P4324 [JSOI2016]扭动的回文串

    传送门 对\(A\).\(B\)串各跑一遍\(manacher\),求出第\(1\).\(2\)类扭动回文串的最大长度. 考虑第三类的扭动回文串\(S(i,j,k)\),一定可以表示为\(A(i,l) ...

  9. 【BZOJ4755】【JSOI2016】扭动的回文串

    [题目链接] 点击打开链接 [思路要点] 一定存在一个最长的扭动回文串是从回文中心所在串的某一个极长回文子串开始,一侧向回文中心所在串匹配,另一侧扭向另一个串匹配.因为任意一个扭动的回文串都对应了一个 ...

最新文章

  1. linux sftp 重命名,linux下ssh/sftp配置和权限设置
  2. poj3007(set的应用)
  3. 不要怂,就是GAN (生成式对抗网络) (五):无约束条件的 GAN 代码与网络的 Graph...
  4. python读取raw图片文件_在python下读取并展示raw格式的图片实例
  5. linux ssh 插件,玩转VSCode插件之Remote-SSH的使用情况
  6. d.php xfso_centos平台基于snort、barnyard2以及base的IDS(入侵检测系统)的搭建与测试及所遇问题汇总...
  7. Recoll:Unix和Linux桌面的文本搜索工具
  8. sql server 内存_SQL Server内存性能指标–第6部分–其他内存指标
  9. IOS中,在两个ViewController之间传值
  10. STM32F103mini教程学习总结与心得(二)---->串口通信
  11. 计算机网络负载均衡图片,负载均衡计算机网络课程网.ppt
  12. linux mongo 搭建+集群
  13. django mysql 登陆界面_django 简单实现登录验证给你 Django用户登录验证跳转问题
  14. JQuery的Ajax标准写法
  15. 如何自己去写一个鼠标驱动_方法 - 做手写电子笔记的方法——如何在Windows电脑/平板上做手写笔记(包括非触屏电脑)(MacOS也可以)...
  16. leancloud 怎么绑定域名_云引擎支持绑定加速域名 | LeanCloud 八月变化
  17. ajax 解析gzip,javascript – 如何让浏览器gunzip一个Ajax获取gziped文本文件?
  18. Linux内核分析——第七章 链接
  19. Spring整合MyBatis源码
  20. 腾讯音乐12月初赴美IPO,250亿美元被低估还是高估?

热门文章

  1. 企业邮箱一年多少钱,邮箱注册教程,企业oa平台
  2. 一抹阳光,几缕思绪...
  3. 中国传统配色网站,你不了解一下吗??
  4. 常用的 PHP 类库 , 资源
  5. 动态规划(4)滑雪问题
  6. 计算机软件商标,计算机软件商标的类别号 是多少?
  7. 为什么使用多级页表?
  8. 18.多级页表与快表
  9. 15 | 浮点数和定点数(上):怎么用有限的Bit表示尽可能多的信息?
  10. 1489. 田忌赛马(贪心)