[bzoj4755][Jsoi2016]扭动的回文串
来自FallDream的博客,未经允许,请勿转载,谢谢。
#include<iostream>
#include<cstdio>
#include<vector>
#define MN 200000
#define rint register int
#define getchar() (*S++)
char BB[<<],*S=BB;
using namespace std;
inline int read()
{
int x = ; char ch = getchar();
while(ch < '' || ch > '') ch = getchar();
while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
return x;
}
inline char Getchar()
{
char c;
do c=getchar(); while(c<'A'||c>'Z');
return c;
} int n,mx,pos,Lt[MN+],Rt[MN+],ans=;
unsigned int f[MN+],F[MN+],pw[MN+];
char A[MN+],B[MN+]; int Solve(int Lt,int Rt)
{
int l=,r=min(Lt,n-Rt+),mid,ans=;
while(l<=r)
{
mid=l+r>>;
unsigned int ha1,ha2;
ha1=f[Lt-mid+]-pw[mid]*f[Lt+];
ha2=F[Rt+mid-]-pw[mid]*F[Rt-];
if(ha1==ha2) ans=mid,l=mid+;
else r=mid-;
}
return ans;
} int main()
{
fread(BB,,<<,stdin);
n=read();pw[]=;
for(rint i=;i<=n;++i) A[i<<]=Getchar(),pw[i]=pw[i-]*;
for(rint i=;i<=n;++i) B[i<<]=Getchar();
for(rint i=;i<=n+;++i) A[i*-]=B[i*-]=']';
mx=,pos=;n=n*+;
for(rint i=n;i;--i) f[i]=f[i+]*+A[i]-'A'+;
for(rint i=;i<=n;++i) F[i]=F[i-]*+B[i]-'A'+;
for(rint i=;i<=n;++i)
{
if(i<=mx) Lt[i]=min(mx-i+,Lt[*pos-i]);
else Lt[i]=;
while(i-Lt[i]>=&&i+Lt[i]<=n&&A[i-Lt[i]]==A[i+Lt[i]]) ++Lt[i];
if(Lt[i]+i->mx) mx=Lt[i]+i-,pos=i;
if(i&) {if(Lt[i]>)ans=max(ans,Solve(i-Lt[i],i+Lt[i]-)+Lt[i]/*);}
else ans=max(ans,Solve(i-Lt[i],i+Lt[i]-)+(Lt[i]-)/*+);
ans=max(ans,(Lt[i]-(i%==))/*+(i%==));
}
mx=n+;pos=n+;
for(rint i=n;i;--i)
{
if(i>=mx) Rt[i]=min(i-mx+,Rt[*pos-i]);
else Rt[i]=;
while(i-Rt[i]>=&&i+Rt[i]<=n&&B[i-Rt[i]]==B[i+Rt[i]]) ++Rt[i];
if(i-Rt[i]+<mx) mx=i-Rt[i]+,pos=i;
if(i&){ if(Rt[i]>) ans=max(ans,Solve(i-Rt[i]+,i+Rt[i])+Rt[i]/*);}
else ans=max(ans,Solve(i-Rt[i]+,i+Rt[i])+(Rt[i]-)/*+);
ans=max(ans,(Rt[i]-(i%==))/*+(i%==));
}
for(rint x=;x<=n;++x)
if((!(x&))&&A[x]==B[x]) ans=max(ans,Solve(x-,x+)+);
printf("%d",ans);
return ;
}
[bzoj4755][Jsoi2016]扭动的回文串的更多相关文章
- BZOJ4755: [JSOI2016]扭动的回文串——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4755 JYY有两个长度均为N的字符串A和B. 一个“扭动字符串S(i,j,k)由A中的第i个字符到 ...
- BZOJ4755 JSOI2016扭动的回文串(二分答案+哈希)
显然答案应该是由单串以某位置为中心的极长回文串继续在另一个串里拓展得到的.枚举中间位置二分答案,哈希判断即可.注意考虑清楚怎么处理偶回文,比如像manacher一样加分隔符. #include< ...
- BZOJ4755 [JSOI2016]扭动的回文串 【后缀数组】【manacher】
题目分析: 我写了史上最丑的后缀数组,怎么办? 首先manacher一遍两个串,这样只用考虑第三问.用$作为间隔符拼接两个串,把第一个串翻转.枚举回文中心,取最长的回文串,对于剩下的部分利用LCP匹配 ...
- [BZOJ4755][JSOI2016]扭动的回文串(manacher+Hash)
前两种情况显然直接manacher,对于第三种,枚举回文中心,二分回文半径,哈希判断即可. #include<cstdio> #include<algorithm> #defi ...
- 【BZOJ4755】 [Jsoi2016]扭动的回文串
BZOJ4755 [Jsoi2016]扭动的回文串 Solution 考虑对于他给出的 A中的一个回文串: B中的一个回文串: 或者某一个回文的扭动字符串S(i,j,k) 这样子几个限制,我们1,2就 ...
- 【BZOJ4755】扭动的回文串(Manacher,哈希)
[BZOJ4755]扭动的回文串(Manacher,哈希) 题面 BZOJ 题解 不要真的以为看见了回文串就是\(PAM,Manacher\)一类就可以过. 这题显然不行啊. 我们主要考虑如何解决跨串 ...
- [BZOJ]4755: [Jsoi2016]扭动的回文串
Time Limit: 10 Sec Memory Limit: 512 MB Description JYY有两个长度均为N的字符串A和B. 一个"扭动字符串S(i,j,k)由A中的第i ...
- 【题解】Luogu P4324 [JSOI2016]扭动的回文串
原题传送门 这题实际挺水的 先对两个字符串分别跑马拉车 就能求出1.2类扭动回文串最大的长度 考虑第三类的扭动回文串\(S(i,j,k)\),一定可以表示为\(A(i,l)+A(l+1,j)+B(j, ...
- [JSOI2016]扭动的回文串
题目 非常板子了 看到求什么最长的回文,我们就想到枚举回文中心的方法 首先对于这个回文串只包含在一个串内的情况,我们随便一搞就可以了,大概\(Manacher\)一下就没有了 对于那种扭动的回文串,我 ...
随机推荐
- 11-TypeScript中的名称空间
在后端开发语言中,比如C#中,可以将不同源代码文件中的代码通过名称空间组合到一起.一般一个类定义在一个源代码文件中,在功能上属于一个上下文的源代码文件通过名称空间进行组织. 在TypeScript中, ...
- WebApi 方法的参数类型总结。
1:[HttpGet] ①:get方法之无参数. [HttpGet] public IHttpActionResult GetStudentInfor() { List<StudentMode ...
- Python之旅.第四章.模块与包.总结(未完待遇)
一.模块 模块: 一系列功能的集合体,在python中一个py文件就是一个模块,模块名就是py文件的文件名: 模块的好处: 1.减少重复的代码 2.拿来主义 定义模块: 就是创建一个py文件: 使用模 ...
- 一种dubbo逻辑路由方案
背景介绍 现在很多的公司都在用dubbo.springcloud做为服务化/微服务的开发框架,服务化之后应用越来越多,链路越来越长,服务环境的治理变的很困难.比如:研发团队的人很多的,同时有几个分支在 ...
- IIFE的形式、原理和常见写法
immediately invoked function expression 立即调用的函数表达式 出现的形式: 最近做牛客网的JS在线编程,遇到几道考闭包的题目,发现闭包的尾巴那儿经常会出现一对小 ...
- Python之进程
进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体:在当代 ...
- mysql导出与导入
环境 centos6.5 32位 Mysql 5.7.19 导出 mysqldump用法 导出整个数据库 [root@mini2 mysql]# mysqldump -p123456 --databa ...
- html学习之简单注册表单
<html> <head> <title>新用户注册</title> <meta charset="utf-8"> &l ...
- APP开发外包时常见的错误
时代在发展,科技在进步,很多企业都想要开发出属于自己的一款APP.然而,不是每个企业都有开发团队或是专门雇一个技术人员来做的,有一个好方法就是把开发APP的工作外包出去,找一个比较好的外包公司根据自己 ...
- 0417 jQuery基础知识
jQuery基础知识 jQuery需要引入一个js文件,并且这个文件在所有js代码之前(包括引入的其他js文件) 基础操作(对比js): 1.找标签: js:document.getElement.. ...