SPOJ 1811 LCS [后缀自动机]
题意:
求两个串的最大连续子串
一个串建SAM,另一个串在上面跑
注意如果走了Suffix Link,sum需要更新为t[u].val+1
Suffix Link有点像失配吧,当前状态s走不了了就到Suffix Link指向的状态fa上去,fa是s的后缀所以是可行的,并且有更多走的机会
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N=25e4+5; int n,m; char a[N],b[N]; struct State{int ch[26],par,val;State():par(0),val(0){memset(ch,0,sizeof(ch));} }t[N<<1]; int sz,root,last; inline int nw(int _){t[++sz].val=_;return sz;} void iniSAM(){sz=0;root=last=nw(0);} void extend(int c){int p=last,np=nw(t[p].val+1);while(p&&t[p].ch[c]==0) t[p].ch[c]=np,p=t[p].par;if(p==0) t[np].par=root;else{int q=t[p].ch[c];if(t[q].val==t[p].val+1) t[np].par=q;else{int nq=nw(t[p].val+1);memcpy(t[nq].ch,t[q].ch,sizeof(t[q].ch));t[nq].par=t[q].par;t[q].par=t[np].par=nq;while(p&&t[p].ch[c]==q) t[p].ch[c]=nq,p=t[p].par;}}last=np; } int ans; void solve(){iniSAM();for(int i=1;i<=n;i++) extend(a[i]-'a');int sum=0,u=root;for(int i=1;i<=m;i++){//printf("hi %d %c \n",i,b[i]);int c=b[i]-'a';if(t[u].ch[c]) u=t[u].ch[c],ans=max(ans,++sum);//puts("ha");else{while(u&&!t[u].ch[c]) u=t[u].par;if(!u) u=root,sum=0;//puts("Not Found");else sum=t[u].val+1,u=t[u].ch[c],ans=max(ans,sum);//puts("Find"); }//printf("u %d %d\n",u,sum); }printf("%d",ans); } int main(){freopen("in","r",stdin);scanf("%s%s",a+1,b+1);n=strlen(a+1);m=strlen(b+1);solve(); }
SPOJ 1811 LCS [后缀自动机]相关推荐
- spoj 1811 LCS 后缀自动机
A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is the s ...
- POJ.2774.Long Long Message/SPOJ.1811.LCS(后缀数组 倍增)
题目链接 POJ2774 SPOJ1811 LCS - Longest Common Substring 比后缀自动机慢好多(废话→_→). \(Description\) 求两个字符串最长公共子串 ...
- SPOJ LCS 后缀自动机
用后缀自动机求两个长串的最长公共子串,效果拔群.多样例的时候memset要去掉. 解题思路就是跟CLJ的一模一样啦. #pragma warning(disable:4996) #include< ...
- SPOJ - NSUBSTR Substrings(后缀自动机)
题目链接:点击查看 题目大意:给出一个字符串,求出每个长度下的子串出现最多的次数 题目分析:对原串跑后缀自动机然后记录每个节点的right集合的大小就是当前节点出现的次数了,这个出现次数显然可以从子节 ...
- spoj 8222 Substrings (后缀自动机)
spoj 8222 Substrings 题意:给一个字符串S,令F(x)表示S的所有长度为x的子串中,出现次数的最大值.求F(1)..F(Length(S)) 解题思路:我们构造S的SAM,那么对于 ...
- SPOJ 1811 LCS,SPOJ 1812 LCS2【SAM裸题,clj的ppt很清楚
反正clj的ppt都讲了 - LCS的话--因为只需要匹配一次,也就不需要更新pre的值了. - 然而LCS2--因为有多个字符串要匹配,于是要把整个SAM上的rec都更新了,所以多了一步从后往前更新 ...
- SPOJ - SUBLEX 【后缀自动机】
题目 求第K小子串 题解 建好SAM后,拓扑排序,反向传递后面所形成的串的数量 最后从根开始,按照儿子形成串的数量与k比较走就好了 #include<iostream> #include& ...
- SPOJ 7258 SUBLEX 后缀自动机
求第k大子串. 按拓扑序处理出一个点往后有多少条路径到终态. 答案就很明显了. #include <cstring> #include <cstdio> #define FOR ...
- 【后缀自动机】SPOJ 1812-LCSII
题意: 给出最多10个长度不超过100000的字符串,求他们的LCS的长度.时限是鬼畜的0.25s . 后缀自动机练习...虽然有人这么说但我并不觉得hash能过. 本题可以说是[论SAM中按step ...
最新文章
- java的4种内部类
- BZOJ1457 棋盘游戏
- 【DP】Mod Mod Mod(CF889E)
- 明细表如何添加重量_关于Revit中明细表标准的导出及导入
- es java字段匹配多个值_es multiMatchQuery多字段匹配异常
- 硅谷华人创业公司Trifo获1100万美元融资,将发布智能扫地机器人
- 机器学习基石笔记9——机器可以怎样学习(1)
- ZStack 3.6.0发布:支持云主机从KVM云平台在线迁移至ZStack
- 织梦 - PHP开源网站管理系统
- mysql数据库实验报告模板_MySQL数据库技术》实验报告模板.doc
- 用91卫图助手获取研究区(勾画研究矢量shp格式范围等)
- SSL证书以及其验证过程
- (数据库-MySQL) Date 函数
- GSR2501国产2.4G PA替代RFX2401C,AT2401C,RT201
- 记录某大门户网站自动跳转不良网站,团队通宵排查病毒木马全过程
- 舰r最新服务器,战舰少女R官方网站—战舰少女-与心爱的舰娘一起守护这片海域...
- 精选优美英文短文1——Dear Basketball(亲爱的篮球)
- Web Service与Rest API
- python 电压 谐波_教你计算总谐波失真(THD)
- 算法-时间复杂度和空间复杂度
热门文章
- (广州)软件开发定制服务,工作流引擎 OA 库存管理系统
- 获取DataRow某列的值的封装
- matplotlib绘制三维轨迹图
- php 的opcode缓存apc以及其安装
- 模仿nginx修改进程名
- Linux内存管理大图(第三稿)
- 【OpenCV】将图像数据由YUV格式转换成JPG格式直接使用,而不保存成文件
- arduino跑python,尝试在我的Arduino和stu上执行Python3.7.2中的代码
- java exception用法_JavaException的使用
- mysql数据库备份方案_MySQL平台数据库备份方案详细说明