P5546-[POI2000]公共串【SAM】
正题
题面链接:https://www.luogu.com.cn/problem/P5546
题目大意
求nnn个串的最长公共子串。
解题思路
注意到最长公共子串一定是其中所有的子串,所以我们可以先随意对一个串构建SAMSAMSAM然后将信息存在上面即可。
然后每一个其他串都丢到那个SAMSAMSAM上跑匹配,每次跑出来的取一个minminmin就好了,注意祖先也要附上值。
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=4100;
int n,cnt,last,f[N],g[N],ans,c[N],rk[N];
int ch[N][26],fa[N],len[N];
char s[N];
void Ins(int c){int p=last;int np=last=++cnt;len[np]=len[p]+1;for(;p&&!ch[p][c];p=fa[p])ch[p][c]=np;if(!p)fa[np]=1;else{int q=ch[p][c];if(len[p]+1==len[q])fa[np]=q;else{int nq=++cnt;len[nq]=len[p]+1;memcpy(ch[nq],ch[q],sizeof(ch[nq]));fa[nq]=fa[q];fa[np]=fa[q]=nq;for(;p&&ch[p][c]==q;p=fa[p])ch[p][c]=nq;}}return;
}
void solve(){scanf("%s",s);int ls=strlen(s);memset(f,0,sizeof(f));int x=1,l=0;for(int i=0;i<ls;i++){int c=s[i]-'a';if(ch[x][c])x=ch[x][c],l++;else{while(x&&!ch[x][c])x=fa[x];if(!x)x=1,l=0;else l=len[x]+1,x=ch[x][c];}f[x]=max(f[x],l);}for(int i=cnt;i>=1;i--)f[fa[rk[i]]]=max(f[fa[rk[i]]],f[rk[i]]);for(int i=1;i<=cnt;i++)g[i]=min(g[i],f[i]);return;
}
int main()
{scanf("%d",&n);last=cnt=1;scanf("%s",s);int l=strlen(s);for(int i=0;i<l;i++)Ins(s[i]-'a');for(int i=1;i<=cnt;i++)g[i]=len[i];for(int i=1;i<=cnt;i++)c[len[i]]++;for(int i=1;i<=l;i++)c[i]+=c[i-1];for(int i=1;i<=cnt;i++)rk[c[len[i]]--]=i;for(int i=2;i<=n;i++)solve();ans=0;for(int i=1;i<=cnt;i++)ans=max(ans,g[i]);printf("%d",ans);return 0;
}
P5546-[POI2000]公共串【SAM】相关推荐
- bzoj2946 [Poi2000]公共串(后缀数组 || 后缀自动机)
bzoj2946 [Poi2000]公共串 原题地址:http://www.lydsy.com/JudgeOnline/problem.php?id=2946 题意: 给出几个由小写字母构成的单词,求 ...
- bzoj 2946 [Poi2000]公共串——后缀自动机
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2946 对每个串都建一个后缀自动机,然后 dfs 其中一个自动机,记录同步的话在别的自动机上走 ...
- 【二分答案】【哈希表】【字符串哈希】bzoj2946 [Poi2000]公共串
二分答案,然后搞出hash值扔到哈希表里.期望复杂度O(n*log(n)). <法一>next数组版哈希表 #include<cstdio> #include<cstri ...
- 面试的算法1(C语言)(整理)(组合数 字符串倒置 最大公共串)
/*求组合数: 求n个数(1....n)中k个数的组合....如:combination(5,3)要求输出:543,542,541,532,531,521,432,431,421,321, *///方 ...
- sa后缀数组使用合集,包括height数组求LPC和LCS,ST表,单调队列优化。
P5546 [POI2000]公共串 所有串合在一起,每两个串放不同的字符,求一遍后缀数组,然后利用height数组求LCS即可. #include<iostream> #include& ...
- 最长公共子串(SA和SAM求法)
这里主要介绍两种求多个字符串最长公共子串的方法. 这里我们以[POI2000]公共串为例题来讲一下这两种不同的方法的区别. 前置知识:后缀数组.后缀自动机 首先先讲一下SA的求法: 我们可以很容易的想 ...
- [颓废史]蒟蒻的刷题记录
QAQ蒟蒻一枚,其实我就是来提供水题库的. 以下记录从2016年开始. 1.1 1227: [SDOI2009]虔诚的墓主人 树状数组+离散化 3132: 上帝造题的七分钟 树状数组 二维区间加减+查 ...
- HDU1403(后缀数组--最长公共子串)
题目:Longest Common Substring 看代码注释请戳这里 题意:判断给定的两个串中,最长的公共串. 思路:将它们合并为一个串,然后利用后缀数组求解. 首先是二倍增算法:时间复杂度为O ...
- 【 HDU - 2594 】Simpsons’ Hidden Talents(KMP应用,求最长前缀后缀公共子串)
题干: Homer: Marge, I just figured out a way to discover some of the talents we weren't aware we had. ...
最新文章
- 实现大规模图计算的算法思路
- java之redis篇(spring-data-redis整合)
- makefile中的include *******
- git 常用命令备查
- html dom透明度,HTML DOM Style overflow 属性
- 接口的屏蔽和限流很难么?Redis全搞定!
- python 变量赋值变成元组
- 山东建筑大学计算机期末试题,2018年山东建筑大学计算机科学与技术学院900计算机专业综合之计算机操作系统考研基础五套测试题...
- phoenix timestamp字段查询
- elementui :on-remove怎么用_绍兴【办公室绿化】怎么操作
- ExtJS4.2学习 php版(五)
- 债券久期为什么难理解
- 互联网未来十年发展趋势
- Sqilabs第五关注入常用注入方式详解
- Java中查看今天周几
- Mac环境下安装hadoop
- 董孝魁:通证经济重塑企业价值,区块链应赋能服务实体
- springboot整合jsp模板
- prometheus对接influxdb
- Java基础入门(六)
热门文章
- HTML5中常见的列表标签包括,介绍几个常用的HTML5标签
- capslock键英语怎么读_刚开始读英文原版书该怎么做?商务英语专业有前途吗?...
- 班尼机器人维修方法_梅州市ABB机器人控制器维修中心
- python hexdigest,Java方法,可以为Hex中的HMAC-SHA256提供与Python方法相同的输出
- gif分解工具_Python之GIF图倒放,沙雕快乐源泉
- phpsotrm怎么 搜索功能_Windows 10 网络搜索设计太反人类?教你如何彻底关闭它
- java 堆栈_Java中线程与堆栈的关系
- vue实现侧边折叠菜单栏手风琴效果
- [JS-BOM]BOM_Location地址栏对象
- [PAT乙级]1021 个位数统计