正题

题面链接: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】相关推荐

  1. bzoj2946 [Poi2000]公共串(后缀数组 || 后缀自动机)

    bzoj2946 [Poi2000]公共串 原题地址:http://www.lydsy.com/JudgeOnline/problem.php?id=2946 题意: 给出几个由小写字母构成的单词,求 ...

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

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

  3. 【二分答案】【哈希表】【字符串哈希】bzoj2946 [Poi2000]公共串

    二分答案,然后搞出hash值扔到哈希表里.期望复杂度O(n*log(n)). <法一>next数组版哈希表 #include<cstdio> #include<cstri ...

  4. 面试的算法1(C语言)(整理)(组合数 字符串倒置 最大公共串)

    /*求组合数: 求n个数(1....n)中k个数的组合....如:combination(5,3)要求输出:543,542,541,532,531,521,432,431,421,321, *///方 ...

  5. sa后缀数组使用合集,包括height数组求LPC和LCS,ST表,单调队列优化。

    P5546 [POI2000]公共串 所有串合在一起,每两个串放不同的字符,求一遍后缀数组,然后利用height数组求LCS即可. #include<iostream> #include& ...

  6. 最长公共子串(SA和SAM求法)

    这里主要介绍两种求多个字符串最长公共子串的方法. 这里我们以[POI2000]公共串为例题来讲一下这两种不同的方法的区别. 前置知识:后缀数组.后缀自动机 首先先讲一下SA的求法: 我们可以很容易的想 ...

  7. [颓废史]蒟蒻的刷题记录

    QAQ蒟蒻一枚,其实我就是来提供水题库的. 以下记录从2016年开始. 1.1 1227: [SDOI2009]虔诚的墓主人 树状数组+离散化 3132: 上帝造题的七分钟 树状数组 二维区间加减+查 ...

  8. HDU1403(后缀数组--最长公共子串)

    题目:Longest Common Substring 看代码注释请戳这里 题意:判断给定的两个串中,最长的公共串. 思路:将它们合并为一个串,然后利用后缀数组求解. 首先是二倍增算法:时间复杂度为O ...

  9. 【 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.  ...

最新文章

  1. 实现大规模图计算的算法思路
  2. java之redis篇(spring-data-redis整合)
  3. makefile中的include *******
  4. git 常用命令备查
  5. html dom透明度,HTML DOM Style overflow 属性
  6. 接口的屏蔽和限流很难么?Redis全搞定!
  7. python 变量赋值变成元组
  8. 山东建筑大学计算机期末试题,2018年山东建筑大学计算机科学与技术学院900计算机专业综合之计算机操作系统考研基础五套测试题...
  9. phoenix timestamp字段查询
  10. elementui :on-remove怎么用_绍兴【办公室绿化】怎么操作
  11. ExtJS4.2学习 php版(五)
  12. 债券久期为什么难理解
  13. 互联网未来十年发展趋势
  14. Sqilabs第五关注入常用注入方式详解
  15. Java中查看今天周几
  16. Mac环境下安装hadoop
  17. 董孝魁:通证经济重塑企业价值,区块链应赋能服务实体
  18. springboot整合jsp模板
  19. prometheus对接influxdb
  20. Java基础入门(六)

热门文章

  1. HTML5中常见的列表标签包括,介绍几个常用的HTML5标签
  2. capslock键英语怎么读_刚开始读英文原版书该怎么做?商务英语专业有前途吗?...
  3. 班尼机器人维修方法_梅州市ABB机器人控制器维修中心
  4. python hexdigest,Java方法,可以为Hex中的HMAC-SHA256提供与Python方法相同的输出
  5. gif分解工具_Python之GIF图倒放,沙雕快乐源泉
  6. phpsotrm怎么 搜索功能_Windows 10 网络搜索设计太反人类?教你如何彻底关闭它
  7. java 堆栈_Java中线程与堆栈的关系
  8. vue实现侧边折叠菜单栏手风琴效果
  9. [JS-BOM]BOM_Location地址栏对象
  10. [PAT乙级]1021 个位数统计