ref

主要是要理解“撑到“最长这个概念

(为啥我的代码这么长QAQ

#include <iostream>
#include <cstdio>
using namespace std;
typedef unsigned long long ull;
int n, pa[200005], pb[200005], ans;
ull bse1[200005], bse2[200005], hsa1[200005], hsa2[200005], hsb1[200005];
ull hsb2[200005];
const int mod1=19260817, mod2=1e9+7;
char sa[200005], sb[200005];
bool iseq(int a, int b, int c, int d){
if(a>b) return true;
ull sa1=0, sb1=0;
if(a)
sa1 = hsa1[a-1] * bse1[b-a+1] % mod1;
sa1 = (hsa1[b] - sa1 + mod1) % mod1;
if(d!=n-1)
sb1 = hsb1[d+1] * bse1[d-c+1] % mod1;
sb1 = (hsb1[c] - sb1 + mod1) % mod1;
if(sa1!=sb1) return false;
sa1 = sb1 = 0;
if(a)
sa1 = hsa2[a-1] * bse2[b-a+1] % mod2;
sa1 = (hsa2[b] - sa1 + mod2) % mod2;
if(d!=n-1)
sb1 = hsb2[d+1] * bse2[d-c+1] % mod2;
sb1 = (hsb2[c] - sb1 + mod2) % mod2;
if(sa1!=sb1) return false;
return true;
}
void manacher(char a[], int b[]){
int id=0, mx=0;
for(int i=1; i<n; i++){
if(i<mx) b[i] = min(b[2*id-i], mx-i);
else b[i] = 1;
while(a[i-b[i]]==a[i+b[i]]) b[i]++;
if(mx<i+b[i]) mx = i + b[i], id = i;
ans = max(ans, b[i]);
}
}
int main(){
cin>>n;
scanf("%s", sa);
scanf("%s", sb);
for(int i=n; i>=0; i--){
sa[2*i+1] = '#';
sa[2*i+2] = sa[i];
}
for(int i=n; i>=0; i--){
sb[2*i+1] = '#';
sb[2*i+2] = sb[i];
}
sa[0] = sb[0] = '$';
n = 2 * (n + 1);
bse1[0] = bse2[0] = 1;
for(int i=1; i<n; i++){
bse1[i] = bse1[i-1] * 131 % mod1;
bse2[i] = bse2[i-1] * 131 % mod2;
}
ull ff=0;
for(int i=0; i<n; i++){
ff = (ff * 131 % mod1 + sa[i]) % mod1;
hsa1[i] = ff;
}
ff = 0;
for(int i=0; i<n; i++){
ff = (ff * 131 % mod2 + sa[i]) % mod2;
hsa2[i] = ff;
}
ff = 0;
for(int i=n-1; i>=0; i--){
ff = (ff * 131 % mod1 + sb[i]) % mod1;
hsb1[i] = ff;
}
ff = 0;
for(int i=n-1; i>=0; i--){
ff = (ff * 131 % mod2 + sb[i]) % mod2;
hsb2[i] = ff;
}
manacher(sa, pa);
manacher(sb, pb);
ans--;
for(int i=1; i<n; i++){
int pos1=i-pa[i], pos2=i+pa[i]-2;
int l=0, r=min(pos1, n-pos2), mid, re;
while(l<=r){
mid = (l + r) >> 1;
if(iseq(pos1-mid+1, pos1, pos2, pos2+mid-1))
re = mid, l = mid + 1;
else r = mid - 1;
}
ans = max(ans, pa[i]+re-1);
}
for(int i=1; i<n; i++){
int pos1=i-pb[i]+2, pos2=i+pb[i];
int l=0, r=min(pos1, n-pos2), mid, re;
while(l<=r){
mid = (l + r) >> 1;
if(iseq(pos1-mid+1, pos1, pos2, pos2+mid-1))
re = mid, l = mid + 1;
else r = mid - 1;
}
ans = max(ans, pb[i]+re-1);
}
cout<<ans<<endl;
return 0;
}

最新文章

  1. Java多线程基础学习(二)
  2. Sql Server 2012新特性 Online添加非空栏位.
  3. Redis代码阅读之Hacking Strings
  4. c_水程序
  5. Creating Custom Login Screen In Oracle Forms 10g
  6. position 属性和 z-index 属性对页面节点层级影响的例子
  7. js-shortid:优雅简洁地实现短ID
  8. swift3.0 hello swift(1)
  9. [置顶] 利用CXF发布webService的小demo
  10. IntelliJ IDEA开发Scala代码,与java集成,maven打包编译
  11. intellij配置hibernate自动生成hbm.xml文件
  12. KVM内核文档阅读笔记
  13. 【原创】大叔经验分享(10)Could not transfer artifact org.apache.maven:maven. from/to central. Received fatal alert: protocol_version
  14. C# 正则表达式提取字符串中括号里的值
  15. 关于final static修饰的常量部署后没有更新的问题
  16. tomcat启动超时_tomcat was unable to start within
  17. Java_6 方法
  18. 通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败。错误:“Connection refused: connect。
  19. Java 图片矢量压缩
  20. Redis debugging guide---官方

热门文章

  1. 学习笔记:《JavaScript高级程序设计》
  2. HTML 5 Web 存储提供了几种存储数据的方法
  3. 常用的Homebrew命令
  4. java核心技术 要点笔记1
  5. Select与SelectMany
  6. NSAutoreleasePool &amp; thread
  7. 深入理解计算机系统_3e 第二章家庭作业 CS:APP3e chapter 2 homework
  8. OO终章
  9. 第十一篇、UITableView headerview下拉放大
  10. 【算法】Fibonacci(斐波那契数列)相关问题