题解:

先跑一下Sa

然后再用kmp匹配一下哪一些位置不行

然后二分答案

代码:

#include<bits/stdc++.h>
const int N=;
using namespace std;
int t[N],a[N],xx[N],yy[N],*x,*y,height[N],rank[N],sa[N];
int n,m,len,len1,pd[N],pd1[N],pd2[N],v[N],p,st[][N],L[N];
char s1[N],s2[N],s3[N];
void get_fail()
{
t[]=-; int j;
for (int i=;i<len1;i++)
{
j=t[i];
while (j!=-&&s3[j]!=s3[i]) j=t[j];
t[i+]=++j;
}
}
void kmp(char s[N],int a[N],int l)
{
int i=; int j=;
while (j<=l)
{
if (s3[i]==s[j]||i==-) i++,j++;
else i=t[i];
if (i==len1)
{
a[j-len1]=;
i=t[i];
}
}
}
int cmp(int i,int j,int k)
{
return y[i]==y[j]&&(i+k>len?-:y[i+k])==(j+k>len?-:y[j+k]);
}
void get_sa()
{
x=xx; y=yy; int m1=;
for (int i=;i<=len;i++) v[x[i]=a[i]]++;
for (int i=;i<=m1;i++) v[i]+=v[i-];
for (int i=len;i>=;i--) sa[v[x[i]]--]=i;
for (int k=;k<=len;k<<=)
{
p=;
for (int i=len-k+;i<=len;i++) y[++p]=i;
for (int i=;i<=len;i++)
if (sa[i]>k) y[++p]=sa[i]-k;
for (int i=;i<=m1;i++) v[i]=;
for (int i=;i<=len;i++) v[x[y[i]]]++;
for (int i=;i<=m1;i++) v[i]+=v[i-];
for (int i=len;i>=;i--) sa[v[x[y[i]]]--]=y[i];
swap(x,y); p=; x[sa[]]=;
for (int i=;i<=len;i++)
x[sa[i]]=cmp(sa[i],sa[i-],k)?p-:p++;
if (p>len) break;
m1=p+;
}
for (int i=;i<=len;i++) rank[sa[i]]=i;
p=;
for (int i=;i<=len;i++)
{
if (rank[i]==) continue;
int j=sa[rank[i]-];
while (i+p<=len&&j+p<=len&&a[i+p]==a[j+p]) p++;
height[rank[i]]=p;
p=max(,p-);
}
}
int calc(int x,int y)
{
int k=L[y-x];
return max(st[k][x],st[k][y-(<<k)+]);
}
int divide(int l,int r)
{
int t=l,ans=r+;
while (l<=r)
{
int mid=(l+r)/;
if (calc(t,mid)) ans=min(ans,mid),r=mid-;
else l=mid+;
}
return ans;
}
int main()
{
scanf("%s",s1);
n=strlen(s1);
scanf("%s",s2);
m=strlen(s2);
scanf("%s",s3);
len1=strlen(s3);
get_fail();
kmp(s1,pd1,n);
kmp(s2,pd2,m);
for (int i=;i<=n;i++)a[i]=s1[i-]-'a'+,pd[i]=pd1[i-];
a[n+]=;len=n+;
for (int i=;i<=m;i++)a[++len]=s2[i-]-'a'+,pd[len]=pd2[i-];
get_sa();
for (int i=;i<=len;i++)st[][i]=pd[i];
for (int i=;i<=;i++)
for (int j=;j<=len;j++)
if (j+(<<i)-<=len)st[i][j]=max(st[i-][j],st[i-][j+(<<(i-))]);
int j=;
for (int i=;i<=len;i++)
{
if (<<(j+)<=i) j++;
L[i]=j;
}
int ans=;
for (int i=;i<=len;i++)
if (sa[i]<=n&&sa[i-]>n+||sa[i]>n+&&sa[i-]<=n)
{
int t=height[i];
int pos=divide(sa[i],sa[i]+height[i]-len1);
t=min(t,pos-sa[i]++len1-);
ans=max(ans,t);
}
printf("%d\n",ans);
}

bzoj3976的更多相关文章

随机推荐

  1. Study之2 Glance相关操作-devstack

    1,Glance的image是存储在backend中,backend配置在: /etc/glance/glance-api.conf.2, devstack默认:image 存放在控制节点本地目录 / ...

  2. 第 8 章 容器网络 - 049 - 准备 Overlay 网络实验环境

    overlay环境准备 在docker-machine (10.12.31.21)的基础上 docker主机 host1 (10.12.31.22) host2 (10.12.31.23) 在dock ...

  3. 猫眼电影爬取(三):requests+pyquery,并将数据存储到mysql数据库

    还是以猫眼电影为例,这次用pyquery库进行爬取 1.简单demo,看看如何使用pyquery提取信息,并将提取到的数据进行组合 # coding: utf-8 # author: hmk impo ...

  4. legend2---开发日志1(legend的数据库整体设计思路是什么)

    legend2---开发日志1(legend的数据库整体设计思路是什么) 一.总结 一句话总结:不同种类的物品分不同的表放,不放到一个物品表里,取所有物品时一个个表的取就好了 不同种类的物品分不同的表 ...

  5. ThinkPHP 日志(如何学好一门技术,教学视频和文档的优缺)

    ThinkPHP 日志(如何学好一门技术,教学视频和文档的优缺) 一.总结 一句话总结:教学视频中介绍的只是基础的最常用的使用,那些不常用的那些视频里面都不会介绍,因为需求小,所以还是需要好好去把参考 ...

  6. 【调试】Idea如何远程debug之SpringBoot jar包启动

    一.Java -jar启动添加如下参数 -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address= -Xdebug是通知JVM工 ...

  7. 20170922xlVBA_GetCellTextFromWordDocument

    Sub GetCellTextFromWordDocument() '应用程序设置 Application.ScreenUpdating = False Application.DisplayAler ...

  8. java.lang.IllegalArgumentException: Service Intent must be explicit 解决办法

    java.lang.IllegalArgumentException: Service Intent must be explicit 意思是服务必须得显式的调用 我之前是这样使用绑定Service的 ...

  9. Django多表查询练习题

    #一 model表:from django.db import models # Create your models here. class Teacher(models.Model): tid=m ...

  10. 1.numpy_overview

    官网文档:https://www.numpy.org.cn/ Numpy 简介 导入numpy Numpy是Python的一个很重要的第三方库,很多其他科学计算的第三方库都是以Numpy为基础建立的. ...