Description

 
       给出几个由小写字母构成的单词,求它们最长的公共子串的长度。
任务:
l        读入单词
l        计算最长公共子串的长度
l        输出结果
 

Input

 
文件的第一行是整数 n,1<=n<=5,表示单词的数量。接下来n行每行一个单词,只由小写字母组成,单词的长度至少为1,最大为2000。
 

Output

仅一行,一个整数,最长公共子串的长度。
 

Sample Input

3
abcb
bca
acbc

Sample Output

 
同poj3450,这里多一种SAM做法
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MN 200002
using namespace std; struct po{
int t[],f,l;
po(){
f=-;l=;
}
}t[MN];
int num=,n,la=,T,MMH,p,m;
char s[];
int mmh[MN],mmh_[MN];
inline void add(int x){
int p=++num,o,ne;
t[p].l=t[la].l+;
while (la!=-&&!t[la].t[x]) t[la].t[x]=p,la=t[la].f;
if (la==-) t[p].f=;else{
o=t[la].t[x];
if (t[o].l==t[la].l+) t[p].f=o;else{
ne=++num;
t[ne]=t[o];
t[ne].l=t[la].l+;
t[o].f=t[p].f=ne;
while (la!=-&&t[la].t[x]==o) t[la].t[x]=ne,la=t[la].f;
}
}
la=p;
}
inline int max(int a,int b){return a>b?a:b;}
inline int min(int a,int b){return a<b?a:b;}
int main(){
int i,j,k;
scanf("%d",&T);
scanf("%s",s);n=strlen(s);T--;
for (i=;i<n;i++) add(s[i]-'a');
memset(mmh,,sizeof(mmh));
while (T--){
memset(mmh_,,sizeof(mmh_));
scanf("%s",s);
n=strlen(s);
p=;m=;
for (i=;i<n;i++)
if (t[p].t[s[i]-'a']){
p=t[p].t[s[i]-'a'];mmh_[p]=max(mmh_[p],++m);
for (k=p;t[k].f!=-;k=t[k].f) mmh_[t[k].f]=max(mmh_[t[k].f],min(mmh_[k],t[t[k].f].l));
}else{
while (p!=-&&!t[p].t[s[i]-'a']) p=t[p].f;
if (p!=-) m=mmh_[p]+,p=t[p].t[s[i]-'a'],mmh_[p]=max(mmh_[p],m);else p=,m=;
for (k=p;t[k].f!=-;k=t[k].f) mmh_[t[k].f]=max(mmh_[t[k].f],min(mmh_[k],t[t[k].f].l));
}
for (i=;i<=num;i++) mmh[i]=min(mmh[i],mmh_[i]);
}
MMH=;
for (i=;i<=num;i++) MMH=max(MMH,mmh[i]);
printf("%d\n",MMH);
}

24340 kb 356 ms C++/Edit 1804 B

bzoj 2946的更多相关文章

  1. BZOJ 2946: [Poi2000]公共串

    2946: [Poi2000]公共串 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 787  Solved: 342[Submit][Status][D ...

  2. BZOJ 2946: [Poi2000]公共串( 后缀自动机 )

    一个串建后缀自动机, 其他串在上面跑, 然后用当前串跑的去更新全部 ------------------------------------------------------------------ ...

  3. 【BZOJ 2946】 2946: [Poi2000]公共串 (SAM)

    2946: [Poi2000]公共串 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1063  Solved: 469 Description      ...

  4. bzoj 2946 [Poi2000]公共串——后缀自动机

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2946 对每个串都建一个后缀自动机,然后 dfs 其中一个自动机,记录同步的话在别的自动机上走 ...

  5. bzoj 2946 公共串 —— 后缀自动机

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2946 建出 n-1 个后缀自动机一起跑呗. 代码如下: #include<cstdio ...

  6. BZOJ 2946 POI2000 公共串 后缀自动机(多串最长公共子串)

    题意概述:给出N个字符串,每个串的长度<=2000(雾...可能是当年的年代太久远机子太差了),问这N个字符串的最长公共子串长度为多少.(N<=5) 抛开数据结构,先想想朴素做法. 设计一 ...

  7. BZOJ 2946 [Poi2000]公共串 ——后缀自动机

    任意选择一个串作为模式串,构建出后缀自动机. 然后用其他的串在后缀自动机上跑匹配. 然后就到了理解后缀自动机性质的时候. 在某一个节点的最大值是可以沿着parent树上传的. 然后用dp[i][j]表 ...

  8. bzoj 2946: [Poi2000]公共串【SAM】

    对第一个串建SAM,把剩下的串在上面跑,每次跑一个串的时候在SAM的端点上记录匹配到这的最大长度,然后对这些串跑的结果取min,然后从这些节点的min中取max就是答案 注意在一个点更新后它的祖先也会 ...

  9. BZOJ 2946 SA/SAM

    思路: 1. 二分+后缀数组 2.SAM //By SiriusRen #include <cstdio> #include <cstring> #include <al ...

随机推荐

  1. 【java】对象序列化Serializable、transient

    package 对象序列化; import java.io.Serializable; @SuppressWarnings("serial") class A implements ...

  2. ionic环境配置及问题

    ionic是什么? 其实就是一款用于开发web app的开源免费框架,和国产的MUI差不多. 官网:https://ionicframework.com/ 必备条件: 安装Node.js 安装Java ...

  3. 用keras作CNN卷积网络书本分类(书本、非书本)

    本文介绍如何使用keras作图片分类(2分类与多分类,其实就一个参数的区别...呵呵) 先来看看解决的问题:从一堆图片中分出是不是书本,也就是最终给图片标签上:“书本“.“非书本”,简单吧. 先来看看 ...

  4. IntelliJ IDEA如何设置头注释,自定义author和date

    下面这张图,保证你一看就会: 下面这个模板,你拿去改一改就行了. /** * @Author: Gosin * @Date: ${DATE} ${TIME} */ 如果觉得上面名字下面的波浪线碍眼,可 ...

  5. 如何在MQ中实现支持任意延迟的消息?

    什么是定时消息和延迟消息? 定时消息:Producer 将消息发送到 MQ 服务端,但并不期望这条消息立马投递,而是推迟到在当前时间点之后的某一个时间投递到 Consumer 进行消费,该消息即定时消 ...

  6. Clonezilla SE---克隆linux------转载

    引入: 本博文将会是<学生机房中的虚拟化>专题中的核心内容.因为,通过本篇博文的讲述,大家可以看到用于网络化批量部署Linux系统的Clonezilla SE搭建的全过程.注意,几乎所有命 ...

  7. 关于sleep函数的一些问题和资料

    //================================================================================================ 2 ...

  8. 如何去除本地文件与svn服务器的关联

    1.每个目录逐个去删除.svn文件夹 .svn属于隐藏文件夹,可通过操纵Windows文件资源管理器使隐藏文件可视,删除该文件,即可. 2.首先建立一个新文件,文件命名为remove-svn-fold ...

  9. Rstudio( bioconductor)下载太慢,用国内镜像

    在Rstudio中,下载软件install.packages()和 bioconductor软件下载命令 source("http://bioconductor.org/biocLite.R ...

  10. 消息队列一:为什么需要消息队列(MQ)?

    为什么会需要消息队列(MQ)? #################################################################################### ...