一开始死磕sam,发现根本没法做。。。。。。

后来想了想,反正匹配子串的大部分不是sam就是 二分+hash啊,,,于是就想了想二分+hash,发现好像可以做啊!

就是假设我们要让 s1[1] 映射到s2 中的位置是 s2[i] ,那么这种情况的答案就很好算了,就是求一次lcp之后把第一个不匹配的钦定成匹配之后再一次lcp。

所以总的时间复杂度就是 O(N * log(N)) 啦。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define ll unsigned long long
using namespace std;
const int maxn=140005,BASE=2875;
char s[maxn],S[maxn];
ll h[maxn],H[maxn],ci[maxn];
int n,m,ans; inline bool EQ(int b,int B,int len){
if(b+len-1>n||B+len-1>m) return 0;
return h[b+len-1]-h[b-1]*ci[len]==H[B+len-1]-H[B-1]*ci[len];
} int main(){
freopen("str.in","r",stdin);
freopen("str.out","w",stdout); scanf("%s%s",s+1,S+1),ci[0]=1;
n=strlen(s+1),m=strlen(S+1);
s[n+1]='6',n++,S[m+1]='~',m++; for(int i=1;i<=n;i++) h[i]=h[i-1]*(ll)BASE+(ll)s[i];
for(int i=1;i<=m;i++) H[i]=H[i-1]*(ll)BASE+(ll)S[i];
for(int i=1;i<=max(n,m);i++) ci[i]=ci[i-1]*(ll)BASE; for(int i=1;i<=m;i++){
int l=0,r=n,mid,an;
while(l<=r){
mid=l+r>>1;
if(EQ(1,i,mid)) l=mid+1,an=mid;
else r=mid-1;
} if(an==n){
ans=an;
break;
} l=0,r=n-an-1;
while(l<=r){
mid=l+r>>1;
if(EQ(an+2,i+an+1,mid)) l=mid+1,ans=max(ans,an+mid+1);
else r=mid-1;
}
} printf("%d\n",ans);
return 0;
}

  

最新文章

  1. ubuntu kylin 14.04安装配置MongoDB v2.6.1(转)
  2. 【PHP】分页条函数封装
  3. oracle 学习摘录
  4. js 格式化数字保留2位小数
  5. JSONP跨域请求数据报错 “Unexpected token :”的解决办法
  6. SQL Server 触发器创建、删除、修改、查看示例
  7. AnnotationSessionFactoryBean用法介绍
  8. 开启Ubuntu Linux下VirtualBox访问USB功能
  9. 被IDEA的打包功能打败了:dubbo服务端打包注意事项
  10. Masonry使用详解
  11. 2015十大顶级开源ERP系统点评
  12. Python内置函数(27)——hasattr
  13. MySQL复制相关参数详解
  14. asp.net core2.0学习笔记
  15. 本地用maven搭建SpringMvc+redis集成
  16. 一种基于zookeeper的分布式队列的设计与实现
  17. 【JAVA】配置JAVA环境变量,安装Eclipse
  18. centos7中使用Rsync和inotify同步文件
  19. maven install时报错Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test
  20. 计算从哪天起应该购买预售火车票.cs

热门文章

  1. Redis实现之对象(一)
  2. 创建数据收集器集(DSC)
  3. requireJS入门学习
  4. IOS开发学习笔记007-数据结构
  5. 使用shell脚本生成数据库markdown文档
  6. Codeforces 1139D(期望dp)
  7. Matlab freqs 函数
  8. Eureka 简介以及简单示例(创建EurekaServer工程)
  9. 个人环境搭建——搭建jenkins持续构建集成环境
  10. git 使用报错记录