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 ...
随机推荐
- Linux基础学习二
新建分区:fdisk /dev/sda(a代表第一块硬盘) 建完后w保存 更新分区表:partprobe mkfs.ext4 /dev/sdb{1..3} : 格式 ...
- 安装composer及切换镜像为国内镜像
一.下载composer php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" 下面的 ...
- Zabbix微信告警
Zabbix微信告警 摘要 Zabbix可以通过多种方式把告警信息发送到指定人,常用的有邮件,短信报警方式,但是越来越多的企业开始使用zabbix结合微信作为主要的告警方式,这样可以及时有效的把告警信 ...
- MyBaties异常之 ORA-00918: 未明确定义列
原因: 如果a表与b表连接,且a与b中存在两个相同的字段,则必须指明字段是哪个表的 箭头所致位置没有指定ROOM_ID为那个表的,应修改为t1.ROOM_ID
- 模拟Django的admin自定义stark组件
1.新建Django项目--新建app:app01和stark--在settings中配置app和数据库--在models.py中新建模型表--完成数据库迁移 2.在stark下的apps.py中: ...
- IOC&DI
[概述] 1.IOC(Inversion of Control): 即“反转控制”,不是什么技术,而是一种设计思想.其思想是反转资源获取的方向. 传统的资源查找方式要求组件向容器发起请求查找资源.作为 ...
- 扫描局域网内所有主机和MAC地址的Shell脚本
#!/bin/bash #author: InBi #date: 2011-08-16 #website: http://www.itwhy.org/2011/08-20/939.html ##### ...
- noip模拟赛 分组
分析:暴力分挺多,也挺好想的,个人感觉两个特殊性质没什么卵用. 对于K=1,n ≤ 1024的情况,从后往前贪心地分,如果能和上一组分在一起就分在一起,否则就再开一组,这样可以保证字典序最小.ai ≤ ...
- Netbeans工具使用记录
#自动换行设置 工具->选项->编辑器->格式设置
- POJ—— 2117 Electricity
Electricity Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5620 Accepted: 1838 Descr ...