题解:

先跑一下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. python Scrapy 常见问题记录

    ImportError: No module named win32api 处理办法 windows系统上出现这个问题的解决需要安装Py32Win模块,但是直接通过官网链接装exe会出现几百个错误,更 ...

  2. WebSocket前后台交互

    其实对于前后台交互有很多种方法(只列举我知道的,嘻嘻): 1:from 表单: 使用场景——小信息量提交给后台 2:ajax(跨域的话用jsonp): 可以进行多量的前后台信心传递: 但实时性不高,不 ...

  3. Day2-异步IO+Scrapy爬虫

    一.异步IO http://www.cnblogs.com/wupeiqi/articles/6229292.html 这篇文章写的不错,展示了多种高并发的方式,从同步执行→多线程→多进程→async ...

  4. m_Orchestrate learning system---mo系统权限思考

    m_Orchestrate learning system---mo系统权限思考 一.总结 一句话总结:注意不同身份访问同一客户端时候的权限,比如面板显示,比如功能按钮 权限 面板 功能 1.小组之间 ...

  5. ThinkPHP执行原生的SQL语句

    执行原生的SQL语句: $sql="insert select update delete...."; ①查询语句:   $model对象 -> query($sql);  ...

  6. 【文献04】无人驾驶高速AWID-AWIS车辆运动控制研究

    参考:阮久宏, 李贻斌, 荣学文, et al. 无人驾驶高速AWID-AWIS车辆运动控制研究[J]. 农业机械学报, 2009, 40(12):37-42. https://drive.wps.c ...

  7. php oracle数据库clob和nclob字段

    php oracle数据库clob和nclob字段 nclob类型 1.nclob不能使用php的stream_get_contents来获取数据库的资源内容, 2.并且nclob只能使用to_cha ...

  8. 安卓四大组件之Sevice组件的简单使用 --Android基础

    1.本例实现了简单的Service(服务)的创建.启动和停止,点击“启动SERVICE”页面会显示“服务被创建”,接着是“服务被启动”.点击“停止SERVICE”页面提示“服务被停止”.太过基础,直接 ...

  9. sgu 139 Help Needed!

    题意:16数码是否有解? 先计算展开成一维后逆序对.如果0在最后一行,那么逆序偶时有解.4*4时(n为偶)0的位置上升一行,逆序对+3或-1(奇偶性变化).(n为奇时+2或+0,不变) #includ ...

  10. 关于Handler中Message的创建问题

    Message用来定义一个包含任意数据的消息对象,这个消息对象是可以被发送给Handler处理的. 我们最好通过Message.obtain()和Handler.obtatinMessage()来得到 ...