省选专练之后缀自动机SPOJ1811LCS - Longest Common Substring
陈老师引入SAM的例题
求两个串的LCS
直接建一个串的SAM,并且把另外一个串放进去跳。
这个方法很经典!
几乎满足了所有两个串的公共串问题的所有解法
有巨子说这个跳是均摊Log的,我也不知道QwQ对不对,反正SPOJ那么严苛的时间是过得了的
#include<bits/stdc++.h>
using namespace std;
const int N=4e5+1000;
char S[N];
struct SAM{int LCS;int ans;int now;struct Node{int pre;int step;int vis[26];}SA[N];int last,cnt;inline void Insert(char C){int p=last;int np=++cnt;last=np;SA[np].step=SA[p].step+1;for(;!SA[p].vis[C-'a'];p=SA[p].pre)SA[p].vis[C-'a']=np;if(!p)SA[np].pre=1;else{int q=SA[p].vis[C-'a'];if(SA[q].step==SA[p].step+1){SA[np].pre=q;}else{int nq=++cnt;SA[nq].step=SA[p].step+1;memcpy(SA[nq].vis,SA[q].vis,sizeof(SA[q].vis));SA[nq].pre=SA[q].pre;SA[np].pre=SA[q].pre=nq;for(;SA[p].vis[C-'a']==q;p=SA[p].pre)SA[p].vis[C-'a']=nq;}}}void GetAns(char C){if(SA[now].vis[C-'a']){LCS++;now=SA[now].vis[C-'a'];}else{for(;now&&!SA[now].vis[C-'a'];now=SA[now].pre);
// cout<<now<<" "<<SA[now].step<<'\n';if(!now)LCS=0,now=1;else LCS=SA[now].step+1,now=SA[now].vis[C-'a'];
// cout<<C<<" "<<now<<" "<<LCS<<'\n';}ans=max(ans,LCS);//
// cout<<now<<" "<<C<<" "<<LCS<<'\n';}void Solve(){LCS=0;now=1;ans=0;cnt=last=1;int len;scanf("%s",S+1);len=strlen(S+1);for(int i=1;i<=len;i++)Insert(S[i]);scanf("%s",S+1);len=strlen(S+1);for(int i=1;i<=len;i++)GetAns(S[i]);cout<<ans;}
}Solution;
int main(){
// freopen("spoj1811.in","r",stdin);Solution.Solve();return 0;
}
转载于:https://www.cnblogs.com/Leo-JAM/p/10079175.html
省选专练之后缀自动机SPOJ1811LCS - Longest Common Substring相关推荐
- SPOJ 1812 LCS2 - Longest Common Substring II (后缀自动机)【两种做法】
SPOJ 1812 LCS2 - Longest Common Substring II (后缀自动机)[两种做法] 手动博客搬家: 本文发表于20181217 23:54:35, 原地址https: ...
- SPOJ 1812 LCS2 - Longest Common Substring II (后缀自动机、状压DP)
手动博客搬家: 本文发表于20181217 23:54:35, 原地址https://blog.csdn.net/suncongbo/article/details/85058680 人生第一道后缀自 ...
- 后缀自动机求多个串的最长公共子串+拓补排序讲解+LCS2 - Longest Common Substring II
网上所有关于后缀自动机拓补排序的文章,都默认读者会拓补排序,简直了. 后缀自动机的拓补排序,就是按照长度进行排序,在进行特定操作的时候,通过较长的后缀来更新较短的后缀.那么也就是通过拓补排序中排名靠后 ...
- 省选专练(学习)AC自动机
我好菜啊 AC自动机都不会 AC自动机可以干什么: 用一个模板串匹配多个子串. 这便让AC自动机可以干许多KMP和Tri树不能干的事. AC自动机的构造 首先建立一颗Trie树. 其次利用KMP的思想 ...
- R6饮料AK赛(NOIP模拟赛)/省选专练HDU 5713 K个联通块
我好菜啊100+60+30 滚犊子吧,两天加起来才410搞个屁我一年前都可以考400 不说了,题毕竟比较难 T1还是水题但是比昨天难 这是一个开绝对值不等式的题. 根据对奇数和偶数的最优根的归纳一定有 ...
- 洛谷P3975【天津省选2015】(后缀自动机DP)
题目链接 https://www.luogu.com.cn/problem/P3975 题解 此题非常经典且重要,是sam的函谷关,必须拿下. 记录每个点endpos大小的方法是在parent树从下往 ...
- 省选专练[POI2008]TRO-Triangles
首先朴素算法极为简单 n^3对吧 然后思考挂上log 排序 然后枚举第一个点 接着再按向量位置关系越靠右越好排序 接着维护一个向量后缀和就完了. 但是这个题卡精度. long double 就好了 # ...
- 省选专练之文艺计算姬
"奋战三星期,造台计算机".小W响应号召,花了三星期造了台文艺计算姬. 文艺计算姬比普通计算机有更多的艺术细胞. 普通计算机能计算一个带标号完全图的生成树个数,而文艺计算姬能计算一 ...
- 省选专练(学习)可持久化Trie树(BZOJ3261)
这个似乎也不是好难啊 但是可持久化Trie还是可以干许多线性基不能干的事. 什么是可持久化Trie? 顾名思义:是一种可以持久化的Trie树 他的建树方式和键值式线段树方式类似 也支持版本的减法 查询 ...
最新文章
- 网站优化离不开内容更新
- java测试时找不到类,我在class文件运行不了测试文件,提示找junit4找不到任何的测试项目...
- python连接oracle视频教程_python怎么连接oracle
- Spring Boot Servlet
- 服务器每天产生1t文件,编写自己的服务器 - osc_popfjd1t的个人空间 - OSCHINA - 中文开源技术交流社区...
- linux串口程序不能,在uclinux下编写串口通信程序,COM2只能发送数据不能接收,是怎么回事呢?...
- (Java) Md5Utils
- vim怎么把一个写的代码文件另存到任意文件夹里?
- centos不同版本的防火墙命令
- java socket 出现丢包_Java知识——网络编程、三次握手四次挥手
- IPhone在横屏字体变大解决办法-webkit-text-size-adjust
- java三角函数计算器_java 计算器代码能实现三角函数和阶乘功能
- 什么PDCA循环+原则?
- 5.秒杀模块-基于redis缓存商品秒杀信息
- 1t硬盘怎么分区最好_1TB的硬盘如何分区比较合理?
- 计算机网络——分层的体系结构(OSI模型/五层协议栈)
- 16福师计算机应用基础在线作业,16春季福师《计算机应用基础》在线作业二分析.doc...
- 【笔试与面试】中软国际
- 如何取消金山快盘自动启动
- CollapsingToolbarLayout折叠toolbar的使用说明
热门文章
- android 动画引擎,一个使用openGL渲染的炫丽Android动画库
- from import python3_《Python语言程序设计》 —3.3.2 from import
- 图片上传成功但是图片显示不出来_小程序上传图片到腾讯云
- 网站推广中的优化雷区作为网站推广专员你了解多少?
- 浅析营销型网站SEO优化的四大原则!
- c语言中二进制文件的访问速度比文本文件快,以下叙述中错误的是( )。A.C语言中对二进制文件的访问速度比文本文件快B...._考试资料网...
- oracle同时更新多列数据,ORACLE 11G 表联合更新多列
- latex公式对齐_论文中的公式如何对齐
- _ISD-SMG518L2CT-F 海康威视测温人脸安检门 温度精度±0.5℃ 人脸抓拍金属探测
- :x 和 :wq 的区别