思路:

写得我头脑发蒙,,, 旁边还有俩唱歌的 抓狂

(感谢lh大爷查错)

首先

1、w是s1的子串

2、w是s2的子串

这两步很好办啊~ 后缀数组一下O(n)就可以搞

重点是 这个:3、s3不是w的子串

怎么办呢

把 1、3做一发KMP

那么取一下min就好了

注意重叠的情况

(其实是可以O(n)搞的 我一开始写错了 改的时候偷懒就直接二分了)

也很快~

//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=100050;
int len1,len2,len3,n,cntA[N],cntB[N],A[N],B[N],sa[N],tsa[N],rk[N],ht[N],next[N],rec[N],ans;
char s[N],s1[N],s2[N],s3[N];
void SA(){
for(int i=1;i<=n;i++)cntA[s[i]]++;
for(int i=1;i<=256;i++)cntA[i]+=cntA[i-1];
for(int i=n;i;i--)sa[cntA[s[i]]--]=i;
rk[sa[1]]=1;
for(int i=2;i<=n;i++)rk[sa[i]]=rk[sa[i-1]]+(s[sa[i]]!=s[sa[i-1]]);
for(int l=1;rk[sa[n]]<n;l<<=1){
memset(cntA,0,sizeof(cntA));
memset(cntB,0,sizeof(cntB));
for(int i=1;i<=n;i++)
cntA[A[i]=rk[i]]++,
cntB[B[i]=(i+l<=n?rk[i+l]:0)]++;
for(int i=1;i<=n;i++)cntA[i]+=cntA[i-1],cntB[i]+=cntB[i-1];
for(int i=n;i;i--)tsa[cntB[B[i]]--]=i;
for(int i=n;i;i--)sa[cntA[A[tsa[i]]]--]=tsa[i];
rk[sa[1]]=1;
for(int i=2;i<=n;i++)rk[sa[i]]=rk[sa[i-1]]+(A[sa[i]]!=A[sa[i-1]]||B[sa[i]]!=B[sa[i-1]]);
}
for(int i=1,j=0;i<=n;i++){
j=j?j-1:0;
while(s[i+j]==s[sa[rk[i]-1]+j])j++;
ht[rk[i]]=j;
}
}
void get_next(){
int j=0;next[1]=0;
for(int i=2;s3[i];i++){
while(j&&s3[i]!=s3[j+1])j=next[j];
if(s3[i]==s3[j+1])j++;
next[i]=j;
}
}
void KMP(){
int j=0;
for(int i=1;i<=n;i++){
while(j&&s[i]!=s3[j+1])j=next[j];
if(s[i]==s3[j+1])j++;
if(j==len3){rec[i]=i;j=next[j];}
}
}
int main(){
scanf("%s%s%s",s1+1,s2+1,s3+1);
len1=strlen(s1+1),len2=strlen(s2+1),len3=strlen(s3+1);
s[len1+1]='#';
for(int i=1;i<=len1;i++)s[i]=s1[i];
for(int i=1;i<=len2;i++)s[i+len1+1]=s2[i];
n=len1+len2+1;
SA();get_next();KMP();rec[n+2]=n+1;
for(int i=n+2;i;i--)if(!rec[i-1])rec[i-1]=rec[i];
for(int i=1;i<=n;i++){
int maxx=max(sa[i],sa[i-1]),minn=min(sa[i],sa[i-1]);
int tempmin=minn,tempmax=maxx;
int tempx=*(lower_bound(rec+1,rec+2+n,len3-1+minn))-minn;
int tempy=*(lower_bound(rec+1,rec+2+n,len3-1+maxx))-maxx;
if(maxx>len1&&minn<=len1)ans=max(ans,min(ht[i],min(tempx,tempy)));
}
printf("%d\n",ans);
}

BZOJ 3796 后缀数组+KMP的更多相关文章

  1. hdu5442(2015长春赛区网络赛1006)后缀数组+KMP /最小表示法?

    题意:给定一个由小写字母组成的长度为 n 的字符串,首尾相连,可以从任意一个字符开始,顺时针或逆时针取这个串(长度为 n),求一个字典序最大的字符串的开始字符位置和顺时针或逆时针.如果有多个字典序最大 ...

  2. UVA 11475 后缀数组/KMP

    题目链接: 题意:给定一个只含字母的字符串,求在字符串末尾添加尽量少的字符使得字符串为回文串. 思路:因为只能从末尾添加字符,所以其实求的是最长的后缀回文串.那么添加的字符为除了这个原串的最长后缀回文 ...

  3. POJ 3450 后缀数组/KMP

    题目链接:http://poj.org/problem?id=3450 题意:给定n个字符串,求n个字符串的最长公共子串,无解输出IDENTITY LOST,否则最长的公共子串.有多组解时输出字典序最 ...

  4. hdu 5769 Substring 后缀数组 + KMP

    http://acm.hdu.edu.cn/showproblem.php?pid=5769 题意:在S串中找出X串出现的不同子串的数目? 其中1 <= |S| < $10^5$ 官方题解 ...

  5. poj 2406 Power Strings (后缀数组 || KMP)

    Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 28859   Accepted: 12045 D ...

  6. POJ3080 POJ3450Corporate Identity(广义后缀自动机||后缀数组||KMP)

    Beside other services, ACM helps companies to clearly state their “corporate identity”, which includ ...

  7. BZOJ 2882 & 后缀数组的傻逼实现

    题意: 一个字符环,求一个开头使字典序最小. SOL: 后缀数组打起来...然后居然卡过...10sec的实现我10936ms...居然卡过??? rank倒三...啦啦啦啦啦.... 改个离散化会不 ...

  8. bzoj 3172 后缀数组|AC自动机

    后缀数组或者AC自动机都可以,模板题. /************************************************************** Problem: 3172 Us ...

  9. bzoj 1301 后缀数组

    比较裸的后缀数组. /************************************************************** Problem: User: BLADEVIL La ...

随机推荐

  1. 修改织梦data目录名

    1.修改include目录下的common.inc.php这个文件.打开文件,找到第24行: define('DEDEDATA', DEDEROOT.'/data'); 把data修改成为您要改的目录 ...

  2. Android GoogleMap 谷歌地图从零开始

    说明 由于国内使用v2最新的谷歌地图有很多限制,所有如果要在真机上测试运行要做一些准备 准备1: vpn必不可少啦 推荐cloud vpn或者betternet都是不错的免费vpn 准备2: 由于最新 ...

  3. poj1111 Image Perimeters 广搜

    题目大意: 输入一个矩阵,再输入其中一个“X”的位置(从1开始).从该位置向八个方向扩展,如果是“X”就可以并在一起.问最后得到的模块的周长是多少. 解题思路: 按照广搜的思路来做.用一个二维的数组标 ...

  4. Oracle PL/SQL开发基础(第三十四弹:RAISE_APPLICATION_ERROR)

    RAISE_APPLICATION_ERROR在子程序内部使用时,能从存储子程序中抛出自定义的错误消息.这样就能将错误报告给应用程序而避免范围未捕获异常. 语法如下: RAISE_APPLICATIO ...

  5. RabbitMQ学习之spring-amqp的重要类的认识

    对于大多数应用来说都做了与spring整合,对于rabbitmq来说.也有与spring的整合.可能通过spring的官网找到spring-amqp项目下载.spring-amqp项目包括三个子项目: ...

  6. Sublime + Chrome 本地调试 CSS 选择器

    生成简单的 HTML 代码 使用MacDown写 Markdown,快捷键ALT+CMD+C拷贝成 HTML 代码 粘贴到 Sublime 中,加上 body 标签和 css 头 html <h ...

  7. Kattis - iBoard

    iBoard After years of success with a single-button mouse, a well known computer company has decided ...

  8. JS 20180416课时训练

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. tomcat 配置 https 几点注意

    1.修改server.xml时候把注释的改改就好,不要添加,免得杂乱. 2.安装openssl openssl-devel autoconf libtool apr tomcat-native 才行. ...

  10. JavaScript学习笔记(第一天)

    javascript个人笔记 JavaScript的组成 JavaScript是一种运行在客户端的脚本语言 ​ ECMAScript 标准----js的基本的语法 DOM------Document ...