spoj Longest Common Substring II
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相关推荐
- SPOJ 1812 LCS2 - Longest Common Substring II (后缀自动机)【两种做法】
SPOJ 1812 LCS2 - Longest Common Substring II (后缀自动机)[两种做法] 手动博客搬家: 本文发表于20181217 23:54:35, 原地址https: ...
- Spoj LCS2 - Longest Common Substring II
题目描述 A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is ...
- SPOJ 1812 LCS2 - Longest Common Substring II (后缀自动机、状压DP)
手动博客搬家: 本文发表于20181217 23:54:35, 原地址https://blog.csdn.net/suncongbo/article/details/85058680 人生第一道后缀自 ...
- SPOJ - LCS2 Longest Common Substring II(后缀自动机)
题目链接:点击查看 题目大意:给出n个字符串,求出最长公共子串的长度 题目分析:之前做过了求两个字符串最长公共子串的长度,相对来说那个题目还算是比较简单入门的,这个题目就稍微有点加大难度了,其实难度也 ...
- SPOJ1812 LCS2 - Longest Common Substring II(SAM)
题目链接 分析: SAM求多串最长公共子串 详解戳这里 #include<cstdio> #include<cstring> #include<iostream>u ...
- 后缀自动机求多个串的最长公共子串+拓补排序讲解+LCS2 - Longest Common Substring II
网上所有关于后缀自动机拓补排序的文章,都默认读者会拓补排序,简直了. 后缀自动机的拓补排序,就是按照长度进行排序,在进行特定操作的时候,通过较长的后缀来更新较短的后缀.那么也就是通过拓补排序中排名靠后 ...
- SPOJ LCS Longest Common Substring
A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is the s ...
- JavaScript实现longest Common Substring最长公共子串算法(附完整源码)
JavaScript实现longest Common Substring最长公共子串算法(附完整源码) longestCommonSubstring.js完整源代码 longestCommonSubs ...
- SPOJ - LCS Longest Common Substring(后缀自动机)
题目链接:点击查看 题目大意:给出两个字符串,求出其最长公共子串的长度 题目分析:可以对第一个字符串建立SAM,然后令第二个字符串在建好的SAM上跑就好了,如果遇到不能跑的点,就往上折返直到找到可以继 ...
最新文章
- JS---设计简易日历
- Repeater使用 AspNetPager分页控件
- 根据坐标获取地图经纬度
- zoj-3802-Easy 2048 Again
- 单链表——判断两个单链表(无头节点)是否相交,如果相交,返回单链表的第一个结点
- mysql多数据源事务_多数据源一致性事务解决方案
- 7-10 A-B (20 分)
- pythonqt4上位机开发_上位机开发之单片机通信实践(一)
- 动态修改php的配置项
- dll的基址与对应的lib文件
- 解密Twitch:一家游戏直播网站缘何价值10亿刀?
- 新机购入 戴尔成就5000
- php 获取当前 周,php如何获取当前时间是第几周
- 操作系统-程序执行时间分析
- BZOJ 2563 阿狸和桃子的游戏 题解(贪心)
- crontab fastadmin thinkphp 定时任务权限不足
- IDM UltraEdit编辑器V26.00.0.48 烈火汉化64位版
- Java基础_集合_List与Set集合(笔记)
- 用c语言编写打猎小游戏,使用c语言编写简单小游戏.docx
- 配置Office Excel运行Python宏脚本!
热门文章
- 笔记 - Ali Cloud OSS 简介 三种常见数据存储类型
- Oracle 用子查询创建表
- 剑指Offer #14 链表中倒数第k个结点(快慢指针) | 图文详解
- 带你玩转关键字Synchronized
- linux 平均磁盘请求数量,Linux之 iostat 解读磁盘io
- 三角形一点到三边距离最小_高中数学:利用正弦定理、余弦定理求解三角形基础题...
- 高德 Serverless 平台建设及实践
- 阿里张磊:如何构建以应用为中心的“Kubernetes”?(内含 QA 整理)
- CNCF 宣布成立应用交付领域小组,正式开启云原生应用时代
- eclipse中设置Linux编码环境,更改eclipse中console编码