$n \leq 1000000$的字符串,对每一个子串$i$~$n-i+1$,求他最长的一个既是前缀又是后缀的子串。

这题要求的东西具有“对称性”,不充分利用难以解决。这里的“对称性”不仅指询问是对称的,更指要求的那个公共部分是对称的——不对称的相同的子串对答案没有丝毫贡献。

从贡献的角度入手,就是求每个前缀$i$和后缀$n-i+1$的一个在前缀$i$的末尾的、在后缀$n-i+1$的开头的一个最长公共串。嗯那赶紧二分+哈希。额等等,从$i$向前延伸,从$n-i+1$向后延伸,字符串是否相同,这样一个函数不单调哦。但是,如果您从前缀$i$的中点处和后缀$n-i+1$的中点处向两边分别延伸,这样字符串是否相同就是一个单调函数了。

因此转移战线,枚举对称相同串的中间位置$i$,然后$i$和$n-i+1$分别向两边延伸看最长的相同串多长,用二分+哈希判断。假设这次二分的答案是$2x-1$,那么$ans_{i-x+1}$就会$max$上$2x-1$。但这个串对$i-x+1$到$i$处的答案都是有贡献的,并且贡献每次减2,为了体现这一点只需要最后统计答案时$ans_i \ \ =max(ans_i,ans_{i-1}-2)$即可。

 #include<stdio.h>
#include<string.h>
#include<stdlib.h>
//#include<queue>
//#include<vector>
#include<algorithm>
//#include<iostream>
//#include<assert.h>
using namespace std; int n;
#define maxn 2000011
char s[maxn]; int h1[maxn],h2[maxn],p1[maxn],p2[maxn],mod1=,mod2=;
int geth1(int L,int R) {return (h1[R]-h1[L-]*1ll*p1[R-L+]%mod1+mod1)%mod1;}
int geth2(int L,int R) {return (h2[R]-h2[L-]*1ll*p2[R-L+]%mod2+mod2)%mod2;} int ans[maxn];
int main()
{
scanf("%d%s",&n,s+);
h1[]=h2[]=;
for (int i=;i<=n;i++) h1[i]=(h1[i-]*27ll+s[i]-'a'+)%mod1,h2[i]=(h2[i-]*27ll+s[i]-'a'+)%mod2;
p1[]=p2[]=;
for (int i=;i<=n;i++) p1[i]=p1[i-]*27ll%mod1,p2[i]=p2[i-]*27ll%mod2; for (int i=;i<=(n+)>>;i++) ans[i]=-;
for (int i=;i<=n>>;i++)
{
int L=,R=i,p=n-i+;
while (L<R)
{
int mid=(L+R+)>>,a=i-mid+,b=i+mid-,c=p-mid+,d=p+mid-;
if (geth1(a,b)==geth1(c,d) && geth2(a,b)==geth2(c,d)) L=mid;
else R=mid-;
}
ans[i-L+]=max(ans[i-L+],*L-);
}
for (int i=;i<=(n+)>>;i++)
{
ans[i]=max(ans[i],ans[i-]-);
printf("%d ",ans[i]);
}
return ;
}

最新文章

  1. JavaScript随笔4
  2. java获取文件的md5值
  3. 随笔SublimeText Theme安装
  4. 百度地图JavaScript API覆盖物旋转时出现偏移
  5. JavaScript权威指南(第六版)--JavaScript概述 DEMO
  6. iOS - (集成支付宝SDK大坑总结)
  7. uistepper on ios versions prior to 5.0
  8. 解锁Dagger2使用姿势(一)
  9. 转:CRect类 的介绍
  10. C#解决MDI窗体闪屏的方法
  11. 在Activity中动态设置TextView的隐藏属性
  12. 陈敏 Java课设实验报告
  13. JS方法:数字转换为千分位字符
  14. Kotlin 条件控制
  15. tf.contrib.rnn.core_rnn_cell.BasicLSTMCell should be replaced by tf.contrib.rnn.BasicLSTMCell.
  16. 大数据【八】Flume部署
  17. PHP 7.0 EOL (PHP 技术支持相关)
  18. 局域网2台机器访问mysql服务器
  19. svn 查找指定文件和后缀变化
  20. Opencv——级联分类器(AdaBoost)

热门文章

  1. Ubuntu16.04下使用sublime text3搭建Python IDE
  2. 机器学习(1)- 概述&amp;线性回归&amp;逻辑回归&amp;正则化
  3. pseudogene|鉴定功能基因|expressed se|quence tag
  4. webuploader项目中多图片上传实例
  5. (2)JSTL的fmt国际化标签库
  6. shell脚本,创建50个文件,删除50个文件。
  7. java在线聊天项目1.3版 ——设计好友列表框功能
  8. Spring 概念及特点 Spring下载地址 控制反转IoC实现原理
  9. 学c++有感
  10. [LUOGU] 1002 过河卒