Description

   给出几个由小写字母构成的单词,求它们最长的公共子串的长度。

任务:

l 读入单词

l 计算最长公共子串的长度

l 输出结果

Input

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

Output

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

Sample Input

3

abcb

bca

acbc

Sample Output


先对第一个串建后缀自动机

然后把其他的串拿到后缀自动机上面去跑

得到每个节点的最大匹配长度

然后用parent数上子节点的答案更新一下父亲节点的答案

最后把每个串跑出来的结果取min

对每个节点的最后结果取max就可以了


#include<bits/stdc++.h>
using namespace std;
#define N 200010
const int CHARSET_SIZE=26;
struct Node{
int ch[CHARSET_SIZE],prt;
int maxl;
Node(int maxl=0):ch(),prt(0),maxl(maxl){}
}t[N];
int root,last,cur;
int topo[N],buc[N];
int newnode(int maxl=0){t[++cur]=Node(maxl);return cur;}
void init(){cur=0;root=last=newnode();}
void extend(int c){
int u=newnode(t[last].maxl+1),v=last;
for(;v&&!t[v].ch[c];v=t[v].prt)t[v].ch[c]=u;
if(!v){t[u].prt=root;}
else if(t[v].maxl+1==t[t[v].ch[c]].maxl){
t[u].prt=t[v].ch[c];
}else{
int n=newnode(t[v].maxl+1),o=t[v].ch[c];
memcpy(t[n].ch,t[o].ch,sizeof(t[o].ch));
t[n].prt=t[o].prt;
t[o].prt=t[u].prt=n;
for(;v&&t[v].ch[c]==o;v=t[v].prt)t[v].ch[c]=n;
}
last=u;
}
void toposort(){
int maxv=0;
for(int p=1;p<=cur;p++){
maxv=max(maxv,t[p].maxl);
buc[t[p].maxl]++;
}
for(int i=1;i<=maxv;i++)buc[i]+=buc[i-1];
for(int p=1;p<=cur;p++)topo[buc[t[p].maxl]--]=p;
fill(buc,buc+maxv+1,0);
}
char c[N];
int ans[N],pic[N];
int main(){
init();
int n;scanf("%d",&n); n--;
scanf("%s",c+1);
int len=strlen(c+1);
for(int i=1;i<=len;i++)extend(c[i]-'a');
toposort();
for(int i=1;i<=cur;i++)ans[i]=t[i].maxl;
while(n--){
for(int i=1;i<=cur;i++)pic[i]=0;
scanf("%s",c+1);
len=strlen(c+1);
int now=1,l=0;
for(int i=1;i<=len;i++){
int tmp=c[i]-'a';
for(;now&&!t[now].ch[tmp];now=t[now].prt);
if(!now)now=1,l=0;
else l=min(l,t[now].maxl)+1,now=t[now].ch[tmp];
pic[now]=max(pic[now],l);
}
for(int j=cur;j;j--){
int k=topo[j];
pic[t[k].prt]=min(t[t[k].prt].maxl,max(pic[t[k].prt],pic[k]));
ans[k]=min(ans[k],pic[k]);
}
}
int res=0;
for(int i=1;i<=cur;i++)res=max(res,ans[i]);
printf("%d",res);
return 0;
}

BZOJ2946 Poi2000 公共串 【后缀自动机】的更多相关文章

  1. BZOJ2946 [Poi2000]公共串(后缀自动机)

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

  2. 【bzoj2946】[Poi2000]公共串 后缀自动机

    [Poi2000]公共串 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1386  Solved: 620[Submit][Status][Discus ...

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

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

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

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

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

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

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

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

  7. 【BZOJ2946】[Poi2000]公共串 后缀数组+二分

    [BZOJ2946][Poi2000]公共串 Description        给出几个由小写字母构成的单词,求它们最长的公共子串的长度. 任务: l        读入单词 l        计 ...

  8. [POI2000] 公共串 - 后缀数组,二分

    [POI2000] 公共串 Description 给出几个由小写字母构成的单词,求它们最长的公共子串的长度. Solution 预处理出后缀数组和高度数组,二分答案 \(k\) ,对于每一个连续的 ...

  9. [bzoj2946][Poi2000]公共串_后缀数组_二分

    公共串 bzoj-2946 Poi-2000 题目大意:给定$n$个字符串,求他们的最长公共子串. 注释:$1\le n\le 5$,$1\le minlen<maxlen\le 2000$. ...

随机推荐

  1. Grunt Part 1

    Grunt Part 1 Objectives and Outcomes In this exercise, you will learn to use Grunt, the task runner. ...

  2. Nginx与PHP(FastCGI)的安装、配置

    摘自:http://www.linuxde.net/2012/03/9130.html 一.什么是 FastCGI FastCGI是一个可伸缩地.高速地在HTTP server和动态脚本语言间通信的接 ...

  3. spring mvc:练习:表单验证(javaConfig配置和注解)

    使用Spring表单标签, 表单验证使用 JSR303 的验证注解,hibernate-validators,提供了使用MessageSource和访问静态资源(如CSS,JavaScript,图片) ...

  4. MS SQL2008执行大脚本文件时,提示“内存不足”的解决办法

    问题描述: 当客户服务器不允许直接备份时,往往通过导出数据库脚本的方式来部署-还原数据库, 但是当数据库导出脚本很大,用Microsoft SQL Server Management Studio执行 ...

  5. poj1113凸包

    就是求凸包的周长加以l为半径的圆周长,证明略 由于之前写过叉积,所以graham扫描算法不是很难理解 #include<map> #include<set> #include& ...

  6. Java的优势

    Java是一种跨平台,适合于分布式计算环境的面向对象编程语言. 具体来说,它具有如下特性: 简单性.面向对象.分布式.解释型.可靠.安全.平台无关.可移植.高性能.多线程.动态性等. 下面我们将重点介 ...

  7. ffmpeg播放RTSP的一点优化

    简单记录一下最近使用ffmpeg播放RTSP做的一点参数优化. 先做如下定义: AVDictionary* options = NULL; 1.画质优化 原生的ffmpeg参数在对1920x1080的 ...

  8. BZOJ 1026 windy数 (数位DP)

    题意 区间[A,B]上,总共有多少个不含前导零且相邻两个数字之差至少为2的正整数? 思路 状态设计非常简单,只需要pos.limit和一个前驱数pre就可以了,每次枚举当前位时判断是否与上一位相差2即 ...

  9. iOS UI-popoverController

    一.简单介绍 1.什么是UIPopoverController 是iPad开发中常见的一种控制器(在iPhone上不允许使用) 跟其他控制器不一样的是,它直接继承自NSObject,并非继承自UIVi ...

  10. Python写入CSV文件的问题

    这篇文章主要是前几天我处理数据时遇到的三个问题: Python写入的csv的问题 Python2与Python3处理写入写入空行不同的处理方式 Python与Python3的编码问题 其实上面第3个问 ...