BZOJ2946 Poi2000 公共串 【后缀自动机】
Description
给出几个由小写字母构成的单词,求它们最长的公共子串的长度。
任务:
l 读入单词
l 计算最长公共子串的长度
l 输出结果
Input
文件的第一行是整数 n,1<=n<=5,表示单词的数量。接下来n行每行一个单词,只由小写字母组成,单词的长度至少为1,最大为2000。
Output
仅一行,一个整数,最长公共子串的长度。
Sample Input
3
abcb
bca
acbc
Sample Output
2
先对第一个串建后缀自动机
然后把其他的串拿到后缀自动机上面去跑
得到每个节点的最大匹配长度
然后用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 公共串 【后缀自动机】的更多相关文章
- BZOJ2946 [Poi2000]公共串(后缀自动机)
Description 给出几个由小写字母构成的单词,求它们最长的公共子串的长度. 任务: l 读入单词 l 计算最长公共子串的长度 l 输 ...
- 【bzoj2946】[Poi2000]公共串 后缀自动机
[Poi2000]公共串 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 1386 Solved: 620[Submit][Status][Discus ...
- BZOJ 2946: [Poi2000]公共串( 后缀自动机 )
一个串建后缀自动机, 其他串在上面跑, 然后用当前串跑的去更新全部 ------------------------------------------------------------------ ...
- bzoj 2946 [Poi2000]公共串——后缀自动机
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2946 对每个串都建一个后缀自动机,然后 dfs 其中一个自动机,记录同步的话在别的自动机上走 ...
- BZOJ 2946 [Poi2000]公共串 ——后缀自动机
任意选择一个串作为模式串,构建出后缀自动机. 然后用其他的串在后缀自动机上跑匹配. 然后就到了理解后缀自动机性质的时候. 在某一个节点的最大值是可以沿着parent树上传的. 然后用dp[i][j]表 ...
- BZOJ 2946 POI2000 公共串 后缀自动机(多串最长公共子串)
题意概述:给出N个字符串,每个串的长度<=2000(雾...可能是当年的年代太久远机子太差了),问这N个字符串的最长公共子串长度为多少.(N<=5) 抛开数据结构,先想想朴素做法. 设计一 ...
- 【BZOJ2946】[Poi2000]公共串 后缀数组+二分
[BZOJ2946][Poi2000]公共串 Description 给出几个由小写字母构成的单词,求它们最长的公共子串的长度. 任务: l 读入单词 l 计 ...
- [POI2000] 公共串 - 后缀数组,二分
[POI2000] 公共串 Description 给出几个由小写字母构成的单词,求它们最长的公共子串的长度. Solution 预处理出后缀数组和高度数组,二分答案 \(k\) ,对于每一个连续的 ...
- [bzoj2946][Poi2000]公共串_后缀数组_二分
公共串 bzoj-2946 Poi-2000 题目大意:给定$n$个字符串,求他们的最长公共子串. 注释:$1\le n\le 5$,$1\le minlen<maxlen\le 2000$. ...
随机推荐
- 数据库的ACID特性详解
ACID是指在 数据库管理系统(DBMS)中事物所具有的四个特性:原子性.一致性.隔离性.持久性 事物:在数据库系统中,一个事务是指由一系列连续的数据库操作组成的一个完整的逻辑过程.这组操作执行前后, ...
- Servlet与线程安全
先说结论:servlet不是线程安全的. servlet运行过程 Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后: ①Web服务器首先检查是否已经装载并创建了 ...
- Location对象常用知识
产品终于上线,后期主要是优化了.在开发过程中用到了很多location对象的知识,趁现在有时间先整理一下. Location 对象存储在 Window 对象的 Location 属性中,可通过wind ...
- python UI自动化测试
为了减小维护成本: 1.UI自动化测试需要有较为稳定的环境 2.代码设计合理,那么我们就需要面向对象的设计一个框架,将重复的代码模块化 一.首先总结一下 UI自动化大概要哪些模块 1.config(配 ...
- 转:CentOS 7使用nmcli配置双网卡聚合LACP
进入CentOS 7以后,网络方面变化比较大,例如eth0不见了,ifconfig不见了,其原因是网络服务全部都由NetworkManager管理了,下面记录下今天下午用nmcli配置的网卡聚合,网络 ...
- 007PHP基础知识——类型转换 外部变量
<?php /**类型转换 */ /*1.自由转换*/ /*2.强制转换:不改变原变量,生成新的变量*/ //转换为字符串: /*$a=100; $b=(string)$a; var_dump( ...
- crypt函数加密验证
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- python中time()时间的相关问题
Python中time模块详解(转) 在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括:time,datetime以及calendar.这篇文章,主要讲解time ...
- New Concept English there (5)
25w/m Editors of newspapers and magazines often go to extremes to provide their readers with unimpor ...
- 如何修改MyEclipse的默认编码方式
在创建jsp页面时,默认首行出现“<%@ page language="java" import="java.util.*" pageEncoding=& ...