正解:manacher+哈希

解题报告:

传送门

要不要先解释下题意,,,我开始看了半天来着QAQ

大概就,要求一个最长的回文串

这个回文串有两种构成可能

一种是单从一个串中拿出来的连续一段

另一种是两个串各拿出连续一段拼起来,其中这两段需要满足第一段的右端点坐标=第二段的左端点坐标

欧克然后看题趴QwQ

首先但从一个串中拿就直接跑个manacher就好

然后问题就在这个从两个串中各拿出一段

首先如果这是个回文串,显然它一定是有一段的一侧是本来就有的回文串,然后另一侧和另一个串构成回文串这样子的QwQ

(umm可能那个本来就有的回文串是空的我不管特殊情况但也差不多来着QwQ

然后仔细思考一下可以发现显然这段本来就有的回文串一定是越长越好的,懒得证了显然不会更劣的QwQ

所以就可以直接枚举每个回文串,然后求一下它的两侧能拓展多少就好

然后这个求,首先显然是有可二分性的,所以就二分+哈希判断下就好

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define il inline
  4. #define gc getchar()
  5. #define ri register int
  6. #define rb register bool
  7. #define rc register char
  8. #define ll unsigned long long
  9. #define rp(i,x,y) for(ri i=x;i<=y;++i)
  10. #define my(i,x,y) for(ri i=x;i>=y;--i)
  11.  
  12. const int N=3e5+,bas=;
  13. int n,str_cnt,f[][N],as;
  14. ll poww[N],hsh[N][];
  15. char a[N],b[N],c[N];
  16.  
  17. il int read()
  18. {
  19. rc ch=gc;ri x=;rb y=;
  20. while(ch!='-' && (ch<'' || ch>''))ch=gc;
  21. if(ch=='-')ch=gc,y=;
  22. while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
  23. return y?x:-x;
  24. }
  25. il void manacher(rc *s,ri *g)
  26. {
  27. s[]='$';ri id=,mx=;
  28. rp(i,,n){g[i]=mx>i?min(g[*id-i],mx-i):;while(s[i-g[i]-]==s[i+g[i]+])++g[i];if(g[i]+i>mx)mx=g[i]+i,id=i;}
  29. }
  30. il ll check(ri gdgs,ri l,ri r)
  31. {
  32. if(gdgs)return hsh[l][]-1ll*hsh[r+][]*poww[r-l+];
  33. return hsh[r][]-1ll*hsh[l-][]*poww[r-l+];
  34. }
  35. il int cal(ri l,ri r)
  36. {
  37. ri as_l=,as_r=min(l,n-r+);
  38. while(as_l<as_r)
  39. {
  40. ri mid=(as_l+as_r)>>;
  41. if(check(,l-(mid+)+,l)==check(,r,r+(mid+)-))as_l=mid+;else as_r=mid;
  42. }
  43. return as_l;
  44. }
  45.  
  46. int main()
  47. {
  48. freopen("4324.in","r",stdin);freopen("4324.out","w",stdout);
  49. n=read();scanf("%s%s",a+,b+);
  50. poww[]=;
  51. rp(i,,n)poww[i]=poww[i-]*bas;
  52. rp(i,,n)hsh[i][]=hsh[i-][]*bas+a[i];
  53. my(i,n,)hsh[i][]=hsh[i+][]*bas+b[i];
  54. rp(i,,n)c[i]=a[i];str_cnt=;rp(i,,n)a[++str_cnt]='*',a[++str_cnt]=c[i];a[++str_cnt]='*';
  55. rp(i,,n)c[i]=b[i];str_cnt=;rp(i,,n)b[++str_cnt]='*',b[++str_cnt]=c[i];b[++str_cnt]='*';
  56. n=(n<<)|;manacher(a,f[]);manacher(b,f[]);
  57. rp(i,,n){ri l=(i-f[][i]+)/,r=(i+f[][i])/;as=max(as,f[][i]+(cal(l-,r)<<));}
  58. rp(i,,n){ri l=(i-f[][i]+)/,r=(i+f[][i])/;as=max(as,f[][i]+(cal(l,r+)<<));}
  59. printf("%d\n",as);
  60. return ;
  61. }

洛谷P4324 扭动的回文串 [JSOI2016] manacher+哈希的更多相关文章

  1. 【BZOJ4755】扭动的回文串(Manacher,哈希)

    [BZOJ4755]扭动的回文串(Manacher,哈希) 题面 BZOJ 题解 不要真的以为看见了回文串就是\(PAM,Manacher\)一类就可以过. 这题显然不行啊. 我们主要考虑如何解决跨串 ...

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

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

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

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

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

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

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

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

  6. [JSOI2016]扭动的回文串

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

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

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

  8. 非确定性有穷状态决策自动机练习题Vol.1 A.扭动的回文串

    非确定性有穷状态决策自动机练习题Vol.1 A.扭动的回文串 题目描述 \(JYY\)有两个长度均为\(N\)的字符串\(A\)和\(B\). 一个"扭动字符串\(S(i,j,k)\)由\( ...

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

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

随机推荐

  1. 分析轮子(五)- Vector.java

    注:玩的是JDK1.7版本 一: 先上类图,从类图上看和 ArrayList.java 非常相像,可查看 分析轮子(一)-ArrayList.java 二:然后看源码,发现和 ArrayList.ja ...

  2. mysql出现unblock with 'mysqladmin flush-hosts'

    朋友发来消息,说一个系统应用登录的时候提示连接超时,让帮忙处理一下.问他应用和数据库是否都正常,回复说数据库好像没有问题,但是应用日志报无法连接数据库. 数据库版本是:5.5.53 让他telnet数 ...

  3. 【转载】VMware虚拟机NAT模式网络配置图文教程

    原文:https://blog.csdn.net/dingguanyi/article/details/77829085 一.引言 在Windows上搭建集群实验环境时,为能够让集群结点之间相互通信, ...

  4. iOS Message from debugger: Terminated due to memory issue ~解决方法

    一.概念: /** 1.内存管理概念 2.查看其他技术分享结论 3.产生崩溃原因 4.解决方法以及思路 CSND: https://blog.csdn.net/shihuboke/article/de ...

  5. 转:图像处理、显示中的行宽(linesize)、步长(stride)、间距(pitch)

    在图像数据传输和显示的过程中有一个不常用的参数:间距. 间距的名称: 它有很多的别名,在使用d3d显示的时候,它叫pitch:在用ffmpeg解码的时候,它叫linesize: 在用ffmpeg转换格 ...

  6. grokking deep learning

    https://www.manning.com/books/grokking-deep-learning?a_aid=grokkingdl&a_bid=32715258

  7. Spring Boot项目的接口防刷

    说明:使用了注解的方式进行对接口防刷的功能,非常高大上,本文章仅供参考 一,技术要点:springboot的基本知识,redis基本操作, 首先是写一个注解类: import java.lang.an ...

  8. MySQL入门很简单-触发器

    1.触发器是由事件来触发某个操作,这些事件包括insert语句.update语句和delete语句.当数据库系统执行这些事件时,会激活触发器执行相应操作.MySQL从5.0.2开始支持触发器.使用触发 ...

  9. P图软件瘦脸眼睛放大和手动瘦身功能

    一直以为是OpenCV写的没想到OpenGL能够做的东西比我想象的多. https://blog.csdn.net/zfgrinm/article/details/79291693 https://b ...

  10. Android Studio中解决jar包重复依赖导致的代码编译错误

    在原本的代码中已经使用了OKHTTP和rxjava,然后今天依赖retrofit的时候一直报错 Program type already present: okhttp3.internal.ws.Re ...