题解:

先跑一下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. c# DataTable 序列化json

     if (ds.Tables[0].Rows.Count != 0)                 {                     var list = GetJsonString(ds ...

  2. 最新省市区数据,sql插入语句

    --省数据 insert into Province (ProvinceName)  values('北京市'); insert into Province (ProvinceName)  value ...

  3. Pychram - 使用介绍

    Pychram - 使用介绍 PyCharm中Directory与Python package的区别 对于Python而言,有一点是要认识明确的,python作为一个相对而言轻量级的,易用的脚本语言( ...

  4. selenium+Page Objects(第一话)

    简单介绍一种selenium用来做web自动化测试的设计模式:Page Objects 一.Page Objects介绍 用官话说它是selenium中的一种页面对象设计模式(不是测试框架!是一种开展 ...

  5. 雷林鹏分享:XML 验证器

    XML 验证器 使用我们的 XML 验证器来对您的 XML 文件进行语法检查. XML 错误会终止您的程序 XML 文档中的错误会终止您的 XML 应用程序. W3C 的 XML 规范声明:如果 XM ...

  6. 卡方分布 | t检验 | F检验 | 卡方检验 | 假设检验 | 各种检验持续总结

    Chi-square distribution introduction 这个视频真的好,完美地解释了卡方统计量是怎么来的! 我们有一个标准正态分布的总体,我们从其中抽一次,取该值的平方就是Q1统计量 ...

  7. WPF:数据和行为

    如果自己来做一个UI框架,我们会首先关注哪些方面?我想UI框架主要处理的一定包括两个主要层次的内容,一个是数据展现,另一个就是数据操作,所以UI框架必须能够接收各种不同的数据并通过UI界面展现出来,然 ...

  8. 微信小程序如何导入字体图标

    前提:我们已经拥有了从阿里图标库下载下来的一系列的字体图标文件1:找个其中的ttf格式的文件,然后打开https://transfonter.org/网站2:点击Add fonts按钮,加载ttf格式 ...

  9. NIM 博弈 牛客小白月赛2 E-是是非非

    题目链接 分析:一个裸的NIM博弈 对于一个Nim游戏的局面(a1,a2,...,an),它是P-position(即当前局面先手必败)当且仅当a1^a2^...^an=0,其中^表示异或(xor)运 ...

  10. 远程桌面连接报错:出现身份验证错误,要求函数不受支持,由于CredSSP加密Oracle修正。

    远程桌面连接错误: 解决方法: 1.在运行中输入gpedit.msc,启动本地组策略编辑器. 2.定位到计算机—管理模板—系统—凭据分配 3.点凭据分配—加密Oracle修正. 4.加密Oracle修 ...