JSOI 2016 扭动的字符串

题面描述

给出两个长度为\(n\)的字符串\(A,B\)

\(S(i,j,k)\)表示把\(A\)中的\([i,j]\)和\(B\)中的\([j,k]\)拼接起来的字符串

问所有回文的\(S(i,j,k)\)或者\(A,B\)中的回文子串的最长长度

思路

枚举回文串的中心。

可以发现,如果能在当前字符串内扩展就尽量扩展,不能扩展了再尝试和另一个字符串匹配。

对于前者,使用\(manacher\)算法

对于后者,二分一个长度,用\(hash\)判断能否匹配。

以上

代码

  1. #include<bits/stdc++.h>
  2. #define pii pair<int,int>
  3. #define mkp(x,y) make_pair(x,y)
  4. using namespace std;
  5. const int sz=2e5+7;
  6. const int p1=998244353;
  7. const int p2=1e8+7;
  8. const int q1=5271314;
  9. const int q2=2374899;
  10. int n,m;
  11. int ans;
  12. int p[2][sz];
  13. char s[2][sz];
  14. char ss[2][sz<<1];
  15. int w[2][sz];
  16. int pre[2][2][sz],suf[2][2][sz];//字符串,哈希,位置
  17. void init(int tp){
  18. int mid=0,r=0;
  19. for(int i=1;i<=m;i++){
  20. if(i<r) p[tp][i]=min(r-i,p[tp][2*mid-i]);
  21. else p[tp][i]=1;
  22. while(ss[tp][i+p[tp][i]]==ss[tp][i-p[tp][i]]) p[tp][i]++;
  23. if(i+p[tp][i]>r) mid=i,r=i+p[tp][i];
  24. }
  25. }
  26. void hash(int tp){
  27. int hs0,hs1;
  28. hs0=hs1=0;
  29. for(int i=1;i<=n;i++){
  30. hs0=(1ll*hs0*q1%p1+s[tp][i])%p1;
  31. hs1=(1ll*hs1*q2%p2+s[tp][i])%p2;
  32. pre[tp][0][i]=hs0;
  33. pre[tp][1][i]=hs1;
  34. }
  35. hs0=hs1=0;
  36. for(int i=n;i>=1;i--){
  37. hs0=(1ll*hs0*q1%p1+s[tp][i])%p1;
  38. hs1=(1ll*hs1*q2%p2+s[tp][i])%p2;
  39. suf[tp][0][i]=hs0;
  40. suf[tp][1][i]=hs1;
  41. }
  42. }
  43. pii gs(int tp,int st,int l){
  44. int sum1=pre[tp][0][st]-1ll*w[0][l]*pre[tp][0][st-l]%p1;
  45. int sum2=pre[tp][1][st]-1ll*w[1][l]*pre[tp][1][st-l]%p2;
  46. if(sum1<0) sum1+=p1;
  47. if(sum2<0) sum2+=p2;
  48. return mkp(sum1,sum2);
  49. }
  50. pii gn(int tp,int st,int l){
  51. int sum1=suf[tp][0][st]-1ll*w[0][l]*suf[tp][0][st+l]%p1;
  52. int sum2=suf[tp][1][st]-1ll*w[1][l]*suf[tp][1][st+l]%p2;
  53. if(sum1<0) sum1+=p1;
  54. if(sum2<0) sum2+=p2;
  55. return mkp(sum1,sum2);
  56. }
  57. int main(){
  58. scanf("%d",&n);
  59. scanf("%s",s[0]+1);
  60. scanf("%s",s[1]+1);
  61. ss[0][0]=ss[1][0]='#';
  62. ss[0][1]=ss[1][1]='|';
  63. for(int i=1;i<=n;i++){
  64. ss[0][2*i]=s[0][i];
  65. ss[1][2*i]=s[1][i];
  66. ss[0][2*i+1]=ss[1][2*i+1]='|';
  67. }
  68. m=2*n+1;
  69. w[0][0]=w[1][0]=1;
  70. for(int i=1;i<=n;i++){
  71. w[0][i]=1ll*w[0][i-1]*q1%p1;
  72. w[1][i]=1ll*w[1][i-1]*q2%p2;
  73. }
  74. init(0),init(1);
  75. hash(0),hash(1);
  76. int L,R,sl,sr,len,l,r,mid;
  77. for(int i=2;i<m;i++){
  78. L=i-p[0][i],R=i+p[0][i];
  79. sl=L/2,sr=R/2-1;
  80. len=p[0][i]-1;
  81. l=0,r=min(sl,n-sr+1);
  82. while(l<r){
  83. mid=(l+r+1)>>1;
  84. if(gs(0,sl,mid)==gn(1,sr,mid)) l=mid;
  85. else r=mid-1;
  86. }
  87. ans=max(ans,len+2*l);
  88. }
  89. for(int i=2;i<m;i++){
  90. L=i-p[1][i],R=i+p[1][i];
  91. sl=L/2+1,sr=R/2;
  92. len=p[1][i]-1;
  93. l=0,r=min(sl,n-sr+1);
  94. while(l<r){
  95. mid=(l+r+1)>>1;
  96. if(gs(0,sl,mid)==gn(1,sr,mid)) l=mid;
  97. else r=mid-1;
  98. }
  99. ans=max(ans,len+2*l);
  100. }
  101. printf("%d\n",ans);
  102. }

JSOI 2016 扭动的字符串的更多相关文章

  1. [JSOI 2016] 最佳团体(树形背包+01分数规划)

    4753: [Jsoi2016]最佳团体 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2003  Solved: 790[Submit][Statu ...

  2. 解题:JSOI 2016 最佳团体

    题面 0/1分数规划+树形背包检查 要求$\frac{\sum P_i}{\sum S_i}的最大值,$按照0/1分数规划的做法,二分一个mid之后把式子化成$\sum P_i=\sum S_i*mi ...

  3. [JSOI 2016] 灯塔

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4850 [算法] 首先对不等式进行移项 : hj <= hi + p - sqr ...

  4. [JSOI 2016] 最佳团体

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4753 [算法] 很明显的分数规划 可以用树形动态规划(树形背包)检验答案 时间复杂度 ...

  5. JSOI 2016 病毒感染 辅助Dp问题

    原题链接:https://www.luogu.com.cn/problem/P5774 分析 直接看这道题,第一个困惑点,那个绝对值的比较是什么东西,根据数学知识,我们可以知道这个意思是k到i的距离小 ...

  6. 《JAVASCRIPT高级程序设计》JSON语法/解析/序列化

    JSON是一种数据格式,不是一种编程语言. 一.语法 JSON语法可以表示以下三种类型的值:简单值.对象.数组. 1.简单值 最简单的JSON数据值就是简单值: 5 "hello world ...

  7. Chrome 调试技巧

    Chrome 调试技巧 1.alert 这个不用多说了,不言自明. 可参考:https://www.cnblogs.com/Michelle20180227/p/9110028.html 2.cons ...

  8. Python连接Access数据库

    前言 今天想要用Python访问Access数据库,折腾了半天,特记录一下 背景 最近想将一些文件记录下来,存入数据库,为此拿LabVIEW写了一个版本,记录环境配置为: LabVIWE:2015 A ...

  9. JNI_Z_08_创建Java对象

    1.步骤 : (1).获取 jclass (2).获取 构造函数的 method id (方法的名称始终为"<init>") (3).创建Java对象的两种方式: (3 ...

随机推荐

  1. Delphi 第2课

    项目文件.dpr单元文件.pas--目标文件.dcu窗体文件.dfu begin 对象名.属性 对象名.方法end; 在delphi 自动提示控制语句结构 键盘输入Ctrl 就可以看到了 代码错误:( ...

  2. (上线时清缓存)laravel 5.1 的程序性能优化(配置文件) - 简书

    代码上到正式环境后执行这六步 php artisan config:clear php artisan config:cache php artisan route:clear php artisan ...

  3. JAVA数据结构之哈希表

    Hash表简介: Hash表是基于数组的,优点是提供快速的插入和查找的操作,编程实现相对容易,缺点是一旦创建就不好扩展,当hash表被基本填满的时候,性能下降非常严重(发生聚集引起的性能的下降),而且 ...

  4. XYIXY.COM短网址在线生成,快速、稳定、永久有效,免费开放网址缩短API接口。

    在PHP中使用API 要在PHP程序中使用API,您必须通过file_get_contents或cURL发送GET请求:两者都是可靠的方法,您可以直接复制下面的代码. <?php /**** S ...

  5. [JZOJ6341] 【NOIP2019模拟2019.9.4】C

    题目 题目大意 给你一颗带点权的树,后面有许多个询问\((u,v)\),问: \[\sum_{i=0}^{k-1}dist(u,d_i) \ or \ a_{d_i}\] \(d\)为\(u\)到\( ...

  6. 5020: [THUWC 2017]在美妙的数学王国中畅游

    传送门 当年听llj讲的时候觉得这简直是个不可做的神题. 现在看来并不是很神,可能是我已经被剧透了的缘故... 一开始以为是函数套函数,懵蔽了好久,结果只是求和 被剧透了泰勒展开就比较水了..只要你不 ...

  7. SCRIPT7002: XMLHttpRequest: 网络错误 0x2ef3的解决方法

    最近在使用jquery easyui datagrid 对页面布局,发现有时在IE下会接收不到数据并报错: SCRIPT7002: XMLHttpRequest: 网络错误 0x2ef3, 由于出现错 ...

  8. maven项目依赖其他jar包的时候,idea运行没问题,java -jar 报错:java.lang.SecurityException: Invalid signature file digest

    当项目依赖其他jar包的时候,打出的jar包执行出错,抛出这个异常. 原因:因为依赖jar包中的META-INF中有多余的.SF文件与当前jar包冲突, 解决方案 一 在打包前删除依赖jar包的.SF ...

  9. STM32 STM32F4 寄存器怎么配置不上, 无法往寄存器写入数据

    当出现这个问题时,往往是因为你没有在RCC寄存器中把相关的时钟使能打开. 配置寄存器之前记得调用"RCC_AxxxPeriphClockCmd"先打开需要配置的时钟源,别调用了“R ...

  10. ICPC 2018 徐州赛区网络赛

    ACM-ICPC 2018 徐州赛区网络赛  去年博客记录过这场比赛经历:该死的水题  一年过去了,不被水题卡了,但难题也没多做几道.水平微微有点长进.     D. Easy Math 题意:   ...