陈老师引入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相关推荐

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

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

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

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

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

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

  4. 省选专练(学习)AC自动机

    我好菜啊 AC自动机都不会 AC自动机可以干什么: 用一个模板串匹配多个子串. 这便让AC自动机可以干许多KMP和Tri树不能干的事. AC自动机的构造 首先建立一颗Trie树. 其次利用KMP的思想 ...

  5. R6饮料AK赛(NOIP模拟赛)/省选专练HDU 5713 K个联通块

    我好菜啊100+60+30 滚犊子吧,两天加起来才410搞个屁我一年前都可以考400 不说了,题毕竟比较难 T1还是水题但是比昨天难 这是一个开绝对值不等式的题. 根据对奇数和偶数的最优根的归纳一定有 ...

  6. 洛谷P3975【天津省选2015】(后缀自动机DP)

    题目链接 https://www.luogu.com.cn/problem/P3975 题解 此题非常经典且重要,是sam的函谷关,必须拿下. 记录每个点endpos大小的方法是在parent树从下往 ...

  7. 省选专练[POI2008]TRO-Triangles

    首先朴素算法极为简单 n^3对吧 然后思考挂上log 排序 然后枚举第一个点 接着再按向量位置关系越靠右越好排序 接着维护一个向量后缀和就完了. 但是这个题卡精度. long double 就好了 # ...

  8. 省选专练之文艺计算姬

    "奋战三星期,造台计算机".小W响应号召,花了三星期造了台文艺计算姬. 文艺计算姬比普通计算机有更多的艺术细胞. 普通计算机能计算一个带标号完全图的生成树个数,而文艺计算姬能计算一 ...

  9. 省选专练(学习)可持久化Trie树(BZOJ3261)

    这个似乎也不是好难啊 但是可持久化Trie还是可以干许多线性基不能干的事. 什么是可持久化Trie? 顾名思义:是一种可以持久化的Trie树 他的建树方式和键值式线段树方式类似 也支持版本的减法 查询 ...

最新文章

  1. 网站优化离不开内容更新
  2. java测试时找不到类,我在class文件运行不了测试文件,提示找junit4找不到任何的测试项目...
  3. python连接oracle视频教程_python怎么连接oracle
  4. Spring Boot Servlet
  5. 服务器每天产生1t文件,编写自己的服务器 - osc_popfjd1t的个人空间 - OSCHINA - 中文开源技术交流社区...
  6. linux串口程序不能,在uclinux下编写串口通信程序,COM2只能发送数据不能接收,是怎么回事呢?...
  7. (Java) Md5Utils
  8. vim怎么把一个写的代码文件另存到任意文件夹里?
  9. centos不同版本的防火墙命令
  10. java socket 出现丢包_Java知识——网络编程、三次握手四次挥手
  11. IPhone在横屏字体变大解决办法-webkit-text-size-adjust
  12. java三角函数计算器_java 计算器代码能实现三角函数和阶乘功能
  13. 什么PDCA循环+原则?
  14. 5.秒杀模块-基于redis缓存商品秒杀信息
  15. 1t硬盘怎么分区最好_1TB的硬盘如何分区比较合理?
  16. 计算机网络——分层的体系结构(OSI模型/五层协议栈)
  17. 16福师计算机应用基础在线作业,16春季福师《计算机应用基础》在线作业二分析.doc...
  18. 【笔试与面试】中软国际
  19. 如何取消金山快盘自动启动
  20. CollapsingToolbarLayout折叠toolbar的使用说明

热门文章

  1. android 动画引擎,一个使用openGL渲染的炫丽Android动画库
  2. from import python3_《Python语言程序设计》 —3.3.2 from import
  3. 图片上传成功但是图片显示不出来_小程序上传图片到腾讯云
  4. 网站推广中的优化雷区作为网站推广专员你了解多少?
  5. 浅析营销型网站SEO优化的四大原则!
  6. c语言中二进制文件的访问速度比文本文件快,以下叙述中错误的是( )。A.C语言中对二进制文件的访问速度比文本文件快B...._考试资料网...
  7. oracle同时更新多列数据,ORACLE 11G 表联合更新多列
  8. latex公式对齐_论文中的公式如何对齐
  9. _ISD-SMG518L2CT-F 海康威视测温人脸安检门 温度精度±0.5℃ 人脸抓拍金属探测
  10. :x 和 :wq 的区别