Longest Common Substring II

SPOJ - LCS2

求10个串的LCS

/*1、用第一个串建立后缀自动机2、len[s] 表示状态s 所能代表的字符串的最大长度mx[s] 表示状态s 在 当前匹配的串的最长匹配后缀长度ans[s] 表示状态s 在所有串的最长匹配后缀长度3、用第2——第10个串在后缀自动机上跑,每次mx[s]=max(mx[s],当前匹配长度)每一个串跑完之后,更新 ans[s]=min(ans[s],mx[s])4、每次匹配完一个字符串的时候,要 从后缀自动机 parent 树 上的叶子节点 向根更新,因为后缀自动机的parent树上,min[s]=max(fa[s])+1,所以子节点能匹配的长度 比 父节点的max要长。父节点是子节点的后缀,父节点可以匹配子节点的后max(fa[s])位,但是在那串在后缀自动机上跑的时候,不能保证经过 s 的 时候 也经过了s到根的链。所以只要子节点s 有匹配长度,父节点的mx[fa[s]]即可修改为len[fa[s]]即max(fa[s])
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 100010
using namespace std;
char s[maxn];
int len[maxn<<1],ch[maxn<<1][26],fa[maxn<<1],sz=1,last=1,p,q,np,nq;
int c[maxn],sa[maxn<<1],mx[maxn<<1],ans[maxn<<1];
void Insert(int c){np=++sz;len[np]=len[last]+1;ans[sz]=len[sz];p=last;while(p&&!ch[p][c])ch[p][c]=np,p=fa[p];if(!p)fa[np]=1;else {q=ch[p][c];if(len[q]==len[p]+1)fa[np]=q;else {nq=++sz;memcpy(ch[nq],ch[q],sizeof(ch[q]));fa[nq]=fa[q];fa[q]=fa[np]=nq;ans[nq]=len[nq]=len[p]+1;while(ch[p][c]==q)ch[p][c]=nq,p=fa[p];}}last=np;
}
void solve(){int l,c,now,nowlen,x;while(scanf("%s",s+1)!=EOF){l=strlen(s+1);now=1;nowlen=0;for(int i=1;i<=l;i++){c=s[i]-'a';while(now&&!ch[now][c]){now=fa[now];nowlen=len[now];}if(!now){nowlen=0;now=1;}else if(ch[now][c]){nowlen++;now=ch[now][c];}mx[now]=max(mx[now],nowlen);}for(int i=sz;i;i--){x=sa[i];ans[x]=min(ans[x],mx[x]);if(fa[x]&&mx[x])mx[fa[x]]=len[fa[x]];mx[x]=0;}}int Ans=0;for(int i=1;i<=sz;i++)Ans=max(Ans,ans[i]);printf("%d",Ans);
}
int main(){freopen("Cola.txt","r",stdin);scanf("%s",s+1);int l=strlen(s+1);for(int i=1;i<=l;i++)Insert(s[i]-'a');for(int i=1;i<=sz;i++)c[len[i]]++;for(int i=1;i<=l;i++)c[i]+=c[i-1];for(int i=sz;i;i--)sa[c[len[i]]--]=i;solve();return 0;
}

转载于:https://www.cnblogs.com/thmyl/p/8779164.html

spoj Longest Common Substring II相关推荐

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

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

  2. Spoj LCS2 - Longest Common Substring II

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

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

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

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

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

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

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

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

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

  7. SPOJ LCS Longest Common Substring

    A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is the s ...

  8. JavaScript实现longest Common Substring最长公共子串算法(附完整源码)

    JavaScript实现longest Common Substring最长公共子串算法(附完整源码) longestCommonSubstring.js完整源代码 longestCommonSubs ...

  9. SPOJ - LCS Longest Common Substring(后缀自动机)

    题目链接:点击查看 题目大意:给出两个字符串,求出其最长公共子串的长度 题目分析:可以对第一个字符串建立SAM,然后令第二个字符串在建好的SAM上跑就好了,如果遇到不能跑的点,就往上折返直到找到可以继 ...

最新文章

  1. JS---设计简易日历
  2. Repeater使用 AspNetPager分页控件
  3. 根据坐标获取地图经纬度
  4. zoj-3802-Easy 2048 Again
  5. 单链表——判断两个单链表(无头节点)是否相交,如果相交,返回单链表的第一个结点
  6. mysql多数据源事务_多数据源一致性事务解决方案
  7. 7-10 A-B (20 分)
  8. pythonqt4上位机开发_上位机开发之单片机通信实践(一)
  9. 动态修改php的配置项
  10. dll的基址与对应的lib文件
  11. 解密Twitch:一家游戏直播网站缘何价值10亿刀?
  12. 新机购入 戴尔成就5000
  13. php 获取当前 周,php如何获取当前时间是第几周
  14. 操作系统-程序执行时间分析
  15. BZOJ 2563 阿狸和桃子的游戏 题解(贪心)
  16. crontab fastadmin thinkphp 定时任务权限不足
  17. IDM UltraEdit编辑器V26.00.0.48 烈火汉化64位版
  18. Java基础_集合_List与Set集合(笔记)
  19. 用c语言编写打猎小游戏,使用c语言编写简单小游戏.docx
  20. 配置Office Excel运行Python宏脚本!

热门文章

  1. 笔记 - Ali Cloud OSS 简介 三种常见数据存储类型
  2. Oracle 用子查询创建表
  3. 剑指Offer #14 链表中倒数第k个结点(快慢指针) | 图文详解
  4. 带你玩转关键字Synchronized
  5. linux 平均磁盘请求数量,Linux之 iostat 解读磁盘io
  6. 三角形一点到三边距离最小_高中数学:利用正弦定理、余弦定理求解三角形基础题...
  7. 高德 Serverless 平台建设及实践
  8. 阿里张磊:如何构建以应用为中心的“Kubernetes”?(内含 QA 整理)
  9. CNCF 宣布成立应用交付领域小组,正式开启云原生应用时代
  10. eclipse中设置Linux编码环境,更改eclipse中console编码