caioj1472: 后缀自动机1:多个串的LCS
子串母串跑合并答案
一个点的fail的dep是比任意一条根到这个点路径长度要小的。
那么改就可以直接来了。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std; int len,a[];
struct SAM
{
int w[],dep,fail;
}ch[];int cnt,last;
void insert(int dep,int x)
{
int pre=last,now=++cnt; ch[now].dep=dep;
last=now; while(pre!=&&ch[pre].w[x]==)
ch[pre].w[x]=now, pre=ch[pre].fail;
if(pre==)ch[now].fail=;
else
{
int nxt=ch[pre].w[x];
if(ch[nxt].dep==ch[pre].dep+)ch[now].fail=nxt;
else
{
int nnxt=++cnt;
ch[nnxt]=ch[nxt];
ch[nnxt].dep=ch[pre].dep+; ch[now].fail=ch[nxt].fail=nnxt;
while(pre!=&&ch[pre].w[x]==nxt)
ch[pre].w[x]=nnxt, pre=ch[pre].fail;
}
}
}
int Rsort[],sa[];
void sssort()
{
for(int i=;i<=cnt;i++)Rsort[ch[i].dep]++;
for(int i=;i<=len;i++)Rsort[i]+=Rsort[i-];
for(int i=cnt;i>=;i--)sa[Rsort[ch[i].dep]--]=i;
} int f[],g[];
void solve()
{
int now=,L=;
memset(f,,sizeof(f));
for(int i=;i<=len;i++)
{
int x=a[i];
while(now!=&&ch[now].w[x]==)
now=ch[now].fail, L=ch[now].dep;
if(ch[now].w[x]!=)
{
L++;
now=ch[now].w[x];
f[now]=max(f[now],L);
}
}
for(int i=cnt;i>=;i--)
{
int x=sa[i],y=ch[sa[i]].fail;
f[y]=min(ch[y].dep,max(f[y],f[x]));
} for(int i=;i<=cnt;i++)g[i]=min(g[i],f[i]);
}
char ss[];
int main()
{
scanf("%s",ss+);len=strlen(ss+);
cnt=last=; ch[].dep=;
for(int i=;i<=len;i++)
a[i]=ss[i]-'a'+, insert(i,a[i]);
sssort(); memset(g,,sizeof(g));
while(scanf("%s",ss+)!=EOF)
{
len=strlen(ss+);
for(int i=;i<=len;i++)a[i]=ss[i]-'a'+;
solve();
} int ans=;
for(int i=;i<=cnt;i++)ans=max(ans,g[i]);
if(ans<=)printf("They are too short!\n");
else printf("True\n%d\n",ans);
return ;
}
caioj1472: 后缀自动机1:多个串的LCS的更多相关文章
- 【BZOJ3277】串(后缀自动机)
[BZOJ3277]串(后缀自动机) 题面 BZOJ 题解 广义后缀自动机??? 照着别人的打了一遍.. 相当于每个串都构建一个后缀自动机 构建完一个串之后,直接把当前的last指回root就行了?? ...
- BZOJ 2946 [Poi2000]公共串 (二分+Hash/二分+后缀数组/后缀自动机)
求多串的最长公共字串. 法1: 二分长度+hash 传送门 法2: 二分+后缀数组 传送门 法3: 后缀自动机 拿第一个串建自动机,然后用其他串在上面匹配.每次求出SAM上每个节点的最长匹配长度后,再 ...
- 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数
目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...
- 【Codeforces235C】Cyclical Quest 后缀自动机
C. Cyclical Quest time limit per test:3 seconds memory limit per test:512 megabytes input:standard i ...
- SPOJ 1812 Longest Common Substring II(后缀自动机)
[题目链接] http://www.spoj.com/problems/LCS2/ [题目大意] 求n个串的最长公共子串 [题解] 对一个串建立后缀自动机,剩余的串在上面跑,保存匹配每个状态的最小值, ...
- BZOJ5417[Noi2018]你的名字——后缀自动机+线段树合并
题目链接: [Noi2018]你的名字 题目大意:给出一个字符串$S$及$q$次询问,每次询问一个字符串$T$有多少本质不同的子串不是$S[l,r]$的子串($S[l,r]$表示$S$串的第$l$个字 ...
- [学习笔记]后缀自动机SAM
好抽象啊,早上看了两个多小时才看懂,\(\%\%\%Fading\) 早就懂了 讲解就算了吧--可以去看看其他人的博客 1.[模板]后缀自动机 \(siz\) 为该串出现的次数,\(l\) 为子串长度 ...
- spoj - Longest Common Substring(后缀自动机模板题)
Longest Common Substring 题意 求两个串的最长公共子串. 分析 第一个串建后缀自动机,第二个串在自动机上跑,对于自动机上的结点(状态)而言,它所代表的最大长度为根结点到当前结点 ...
- CODE【VS】3160 最长公共子串 (后缀自动机)
3160 最长公共子串 题目描述 Description 给出两个由小写字母组成的字符串,求它们的最长公共子串的长度. 输入描述 Input Description 读入两个字符串 输出描述 Outp ...
随机推荐
- centos 简单用户管理
一.配置文件 /etc/passwd:存放用户信息,以“:”分割成7个部分 1.账号名称,用来对应UID: 2.早期密码存放位置,后来密码改存/etc/shadow中,以“x”代替: 3.UID,使用 ...
- 8.url路由
1.单一路由对应 url(r'^index/$', views.index), 这里要注意的是,/$ 表示只有只/结尾的才有效,如果把$符号去掉的话,只要是以index/开头都会匹配到这个url. 2 ...
- ruby rspec安装
在rubymine里新建Rails application
- 安装bitcore
官网----------------------------------------------https://bitcore.io先安装好 node.js v4, npmsudo npm inst ...
- Shader Wave
Shader Wave 一.原理 1. 采用 UV 坐标为原始数据,生成每一条波浪线. 2. 使用 Unity 的 Time.y 作为时间增量,动态变换波形. 二.操作步骤 1. 首先使用纹理坐标生成 ...
- 又一个ajax实例,结合jQuery
又一个ajax实例,配合jQuery html <!DOCTYPE html> <html lang="zh-cn"> <head> < ...
- xtu summer individual 5 D - Subsequence
Subsequence Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ID ...
- Excel表格如何设置密码 Excel2003/2007/2010设置密码教程
http://www.wordlm.com/special/2/ 经常使用Excel表格制作报表和一些数据后,我们会给Excel表格设置密码,这样可以很有效的防止数据被盗取.目前Office版本众多, ...
- 启的服务有时候突然报错:org.xml.sax.SAXParseException: schema_reference.4
记录一下,原文地址:http://blog.csdn.net/bluishglc/article/details/7596118
- 2018/4/7 Mybatis源码结构概览
在观看Mybatis源码的过程中,有一点疑惑,就是Mybatis的缓存设计明显有问题,首先,Mybatis缓存分为两级,先说一级,生命周期为一个sqlsession,只有在查询相同方法时才会命中缓存, ...