题意:

求两个串的最大连续子串


一个串建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 [后缀自动机]相关推荐

  1. spoj 1811 LCS 后缀自动机

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

  2. POJ.2774.Long Long Message/SPOJ.1811.LCS(后缀数组 倍增)

    题目链接 POJ2774 SPOJ1811 LCS - Longest Common Substring 比后缀自动机慢好多(废话→_→). \(Description\) 求两个字符串最长公共子串 ...

  3. SPOJ LCS 后缀自动机

    用后缀自动机求两个长串的最长公共子串,效果拔群.多样例的时候memset要去掉. 解题思路就是跟CLJ的一模一样啦. #pragma warning(disable:4996) #include< ...

  4. SPOJ - NSUBSTR Substrings(后缀自动机)

    题目链接:点击查看 题目大意:给出一个字符串,求出每个长度下的子串出现最多的次数 题目分析:对原串跑后缀自动机然后记录每个节点的right集合的大小就是当前节点出现的次数了,这个出现次数显然可以从子节 ...

  5. spoj 8222 Substrings (后缀自动机)

    spoj 8222 Substrings 题意:给一个字符串S,令F(x)表示S的所有长度为x的子串中,出现次数的最大值.求F(1)..F(Length(S)) 解题思路:我们构造S的SAM,那么对于 ...

  6. SPOJ 1811 LCS,SPOJ 1812 LCS2【SAM裸题,clj的ppt很清楚

    反正clj的ppt都讲了 - LCS的话--因为只需要匹配一次,也就不需要更新pre的值了. - 然而LCS2--因为有多个字符串要匹配,于是要把整个SAM上的rec都更新了,所以多了一步从后往前更新 ...

  7. SPOJ - SUBLEX 【后缀自动机】

    题目 求第K小子串 题解 建好SAM后,拓扑排序,反向传递后面所形成的串的数量 最后从根开始,按照儿子形成串的数量与k比较走就好了 #include<iostream> #include& ...

  8. SPOJ 7258 SUBLEX 后缀自动机

    求第k大子串. 按拓扑序处理出一个点往后有多少条路径到终态. 答案就很明显了. #include <cstring> #include <cstdio> #define FOR ...

  9. 【后缀自动机】SPOJ 1812-LCSII

    题意: 给出最多10个长度不超过100000的字符串,求他们的LCS的长度.时限是鬼畜的0.25s . 后缀自动机练习...虽然有人这么说但我并不觉得hash能过. 本题可以说是[论SAM中按step ...

最新文章

  1. java的4种内部类
  2. BZOJ1457 棋盘游戏
  3. 【DP】Mod Mod Mod(CF889E)
  4. 明细表如何添加重量_关于Revit中明细表标准的导出及导入
  5. es java字段匹配多个值_es multiMatchQuery多字段匹配异常
  6. 硅谷华人创业公司Trifo获1100万美元融资,将发布智能扫地机器人
  7. 机器学习基石笔记9——机器可以怎样学习(1)
  8. ZStack 3.6.0发布:支持云主机从KVM云平台在线迁移至ZStack
  9. 织梦 - PHP开源网站管理系统
  10. mysql数据库实验报告模板_MySQL数据库技术》实验报告模板.doc
  11. 用91卫图助手获取研究区(勾画研究矢量shp格式范围等)
  12. SSL证书以及其验证过程
  13. (数据库-MySQL) Date 函数
  14. GSR2501国产2.4G PA替代RFX2401C,AT2401C,RT201
  15. 记录某大门户网站自动跳转不良网站,团队通宵排查病毒木马全过程
  16. 舰r最新服务器,战舰少女R官方网站—战舰少女-与心爱的舰娘一起守护这片海域...
  17. 精选优美英文短文1——Dear Basketball(亲爱的篮球)
  18. Web Service与Rest API
  19. python 电压 谐波_教你计算总谐波失真(THD)
  20. 算法-时间复杂度和空间复杂度

热门文章

  1. (广州)软件开发定制服务,工作流引擎 OA 库存管理系统
  2. 获取DataRow某列的值的封装
  3. matplotlib绘制三维轨迹图
  4. php 的opcode缓存apc以及其安装
  5. 模仿nginx修改进程名
  6. Linux内存管理大图(第三稿)
  7. 【OpenCV】将图像数据由YUV格式转换成JPG格式直接使用,而不保存成文件
  8. arduino跑python,尝试在我的Arduino和stu上执行Python3.7.2中的代码
  9. java exception用法_JavaException的使用
  10. mysql数据库备份方案_MySQL平台数据库备份方案详细说明