SPOJ1812 LCS2


题意:给n个串,求最长公共子串

做法:对第一个串建\(SAM\),拿剩余的串类似于求\(LCS\)的在上面跑,对于当前这个串,求出可以到达每个状态的最长子串长度,然后,每个状态对每个串的匹配取最小值,最后取最大值就是答案。现在考虑如何求到达每个状态的最长子串长度,我们先类似于求\(LCS\)的,维护一个\(now\)表示当前状态,\(l\)表示匹配的长度,在跑的过程中更新每个状态的最长子串长度,显然更新完一个状态后,这个状态的所有有缀,即\(parent\)树上,这个状态的祖先们,都应该更新,于是在匹配都结束后,倒着拓扑序更新完所有的状态。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>const int N = 100010;
typedef long long ll;using namespace std;struct SAM {int n, step[N<<1], fa[N<<1], ch[N<<1][26], tmp[N<<1], num[N<<1], mn[N<<1], last, root, cnt, A[N];char s[N];void init() {memset(mn, 0x3f, sizeof(mn));cnt = 0; last = root = ++ cnt;}void add(int x) {int p = last, np = ++cnt;step[np] = step[p] + 1;while(p && !ch[p][x]) ch[p][x] = np, p = fa[p];if(!p) fa[np] = root;else {int q = ch[p][x];if(step[q] == step[p] + 1) fa[np] = q;else {int nq = ++ cnt;fa[nq] = fa[q]; memcpy(ch[nq], ch[q], sizeof(ch[q]));fa[q] = fa[np] = nq;  step[nq] = step[p] + 1;while(p && ch[p][x] == q) ch[p][x] = nq, p = fa[p];}}last = np;}void calright() {for(int i = 1; i <= cnt; ++i) ++ A[step[i]];for(int i = 1; i <= n; ++i) A[i] += A[i-1];for(int i = cnt; i; --i) num[A[step[i]]--] = i;}void run() {scanf(" %s",s+1), n = strlen(s + 1);for(int i = 1; i <= n; ++i) add(s[i]-'a');calright();memset(mn, 0x3f, sizeof(mn));}void solve(char b[]) {memset(tmp,0,sizeof(tmp));int m = strlen(b+1), now = 1, l = 0;for(int i = 1; i <= m; ++i) {if(ch[now][b[i] - 'a'])  ++ l, now = ch[now][b[i] - 'a'];else {while(now  && !ch[now][b[i] - 'a']) now = fa[now];if(!now) now = 1, l = 0;else l = step[now]+1, now = ch[now][b[i] - 'a'];}tmp[now] = max(tmp[now], l); /// only update the end}for(int i = cnt; i; --i) {mn[num[i]] = min(mn[num[i]], tmp[num[i]]);if( fa[num[i]] && tmp[num[i]] ) tmp[fa[num[i]]] = step[fa[num[i]]];}}} Fe;char str[N];int main() {// freopen("in","r",stdin);Fe.init();Fe.run();while(~ scanf(" %s",str+1)) {Fe.solve(str);}int ans = 0;for(int i = 1; i <= Fe.cnt; ++i) ans = max(ans, Fe.mn[i]);printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/RRRR-wys/p/10200443.html

SPOJ1812 LCS2相关推荐

  1. SPOJ1812 LCS2 - Longest Common Substring II(SAM)

    题目链接 分析: SAM求多串最长公共子串 详解戳这里 #include<cstdio> #include<cstring> #include<iostream>u ...

  2. SPOJ 1812 LCS2 - Longest Common Substring II (后缀自动机)【两种做法】

    SPOJ 1812 LCS2 - Longest Common Substring II (后缀自动机)[两种做法] 手动博客搬家: 本文发表于20181217 23:54:35, 原地址https: ...

  3. SPOJ1812(后缀自动机求n个串的最长公共子串)

    题目:http://www.spoj.com/problems/LCS2/ 题意:给定n个串,求它们的最长公共子串. 思路就是:先将一个串建SAM,然后用后面的串去匹配,对于每一个串,保存最大值,对于 ...

  4. SPOJ 1811 LCS,SPOJ 1812 LCS2【SAM裸题,clj的ppt很清楚

    反正clj的ppt都讲了 - LCS的话--因为只需要匹配一次,也就不需要更新pre的值了. - 然而LCS2--因为有多个字符串要匹配,于是要把整个SAM上的rec都更新了,所以多了一步从后往前更新 ...

  5. Spoj LCS2 - Longest Common Substring II

    题目描述 A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is ...

  6. SPOJ 1812 LCS2 - Longest Common Substring II (后缀自动机、状压DP)

    手动博客搬家: 本文发表于20181217 23:54:35, 原地址https://blog.csdn.net/suncongbo/article/details/85058680 人生第一道后缀自 ...

  7. SPOJ - LCS2 Longest Common Substring II(后缀自动机)

    题目链接:点击查看 题目大意:给出n个字符串,求出最长公共子串的长度 题目分析:之前做过了求两个字符串最长公共子串的长度,相对来说那个题目还算是比较简单入门的,这个题目就稍微有点加大难度了,其实难度也 ...

  8. 后缀自动机求多个串的最长公共子串+拓补排序讲解+LCS2 - Longest Common Substring II

    网上所有关于后缀自动机拓补排序的文章,都默认读者会拓补排序,简直了. 后缀自动机的拓补排序,就是按照长度进行排序,在进行特定操作的时候,通过较长的后缀来更新较短的后缀.那么也就是通过拓补排序中排名靠后 ...

  9. spoj Longest Common Substring II

    Longest Common Substring II SPOJ - LCS2 求10个串的LCS /*1.用第一个串建立后缀自动机2.len[s] 表示状态s 所能代表的字符串的最大长度mx[s] ...

最新文章

  1. 不用数学也能讲清贝叶斯理论的马尔可夫链蒙特卡洛方法?这篇文章做到了
  2. 什么是整洁的代码?什么是肮脏的代码?
  3. NMAP分布式扫描工具dnmap
  4. 阿里淘宝一直在推的响应式编程到底是个什么鬼?
  5. ups的空开、电缆及电池的配置计算
  6. 阿里云消息队列python_41. Python Queue 多进程的消息队列 PIPE
  7. [html] 简述下html5的离线储存原理,同时说明如何使用?
  8. stringbuilder_string和stringBuilder的区别
  9. js隐藏打开项目隐藏编辑 和删除按钮
  10. ASP生成静态页面的方法
  11. 漫游飞行_除了防打扰,手机飞行模式还有这些作用
  12. node 请求内网_Nodejs轻松搭建局域网服务器
  13. IBM R52和T43 换硬盘报错 信息2010错误 解决方法
  14. linux pci转can驱动程序,PCI转LPT并口卡驱动程序
  15. 『解疑』script标签 中 deffer和async属性的区别?
  16. WA47 电子管麦克风
  17. Matlab 绘制零极点图
  18. 印象笔记Evernote 教程
  19. Win11安装虚拟机出现电脑蓝屏解决方案
  20. 邬贺铨院士:5G技术影响智联网的关键点

热门文章

  1. python小游戏——21点
  2. 「软件项目管理」一文详解软件项目成本计划
  3. 单调栈思维 2021年度训练联盟热身训练赛第三场——K题 Summer Trip
  4. CoreJava 笔记总结-第五章 继承
  5. E:Tree Queries(假树链剖分写法)
  6. [蓝桥杯2017决赛]分考场、OpenJudge:分成互质数
  7. Codeforces Round #610 (Div. 2) D. Enchanted Artifact 交互 + 思维
  8. 【CF1020C】Election【贪心】
  9. CF908G. New Year and Original Order
  10. cf1562D Two Hundred Twenty One