LCS - Longest Common Substring

A string is finite sequence of characters over a non-empty finite set Σ.

In this problem, Σ is the set of lowercase letters.

Substring, also called factor, is a consecutive sequence of characters occurrences at least once in a string.

Now your task is simple, for two given strings, find the length of the longest common substring of them.

Here common substring means a substring of two or more strings.

Input

The input contains exactly two lines, each line consists of no more than 250000 lowercase letters, representing a string.

Output

The length of the longest common substring. If such string doesn't exist, print "0" instead.

Example

Input:
alsdfkjfjkdsal
fdjskalajfkdslaOutput:
3

Notice: new testcases added


题意:

  求两个串的最长公共子串。

题解:

  先用第一个串构造出后缀自动机,然后逐个的匹配第二个串

  如果当前节点失配,利用Suffix Links 往后跳就可以了。

#include <bits/stdc++.h>
inline long long read(){long long x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;}
using namespace std;const int N = 3e5+7;const long long mod = 1000000007;int isPlus[N * 2],endpos[N * 2];int d[N * 2];
int tot,slink[2*N],trans[2*N][28],minlen[2*N],maxlen[2*N],pre;
int newstate(int _maxlen,int _minlen,int* _trans,int _slink){maxlen[++tot]=_maxlen;minlen[tot]=_minlen;slink[tot]=_slink;if(_trans)for(int i=0;i<26;i++)trans[tot][i]=_trans[i],d[_trans[i]]+=1;return tot;
}
int add_char(char ch,int u){int c=ch-'a',v=u;int z=newstate(maxlen[u]+1,-1,NULL,0);isPlus[z] = 1;while(v&&!trans[v][c]){trans[v][c]=z;d[z]+=1;v=slink[v];}if(!v){ minlen[z]=1;slink[z]=1;return z;}int x=trans[v][c];if(maxlen[v]+1==maxlen[x]){slink[z]=x;minlen[z]=maxlen[x]+1;return z;}int y=newstate(maxlen[v]+1,-1,trans[x],slink[x]);slink[z]=slink[x]=y;minlen[x]=minlen[z]=maxlen[y]+1;while(v&&trans[v][c]==x){trans[v][c]=y;d[x]--,d[y]++;v=slink[v];}minlen[y]=maxlen[slink[y]]+1;return z;
}
void init_sam() {for(int i = 1; i <= tot; ++i)for(int j = 0; j < 26; ++j) trans[i][j] = 0;pre = tot = 1;
}
char a[N],b[N];
int main() {scanf("%s%s",a,b);init_sam();int n = strlen(a);int m = strlen(b);for(int i = 0; i < n; ++i)pre = add_char(a[i],pre);int ans = 0;int now = 1;int sum = 0;for(int i = 0; i < m; ++i) {if(trans[now][b[i]-'a']) {now = trans[now][b[i]-'a'];} else {while(now) {now = slink[now];if(trans[now][b[i]-'a']) break;}if(!now) now = 1,sum = 0;else {if(trans[now][b[i]-'a']) {sum = maxlen[now] + 1;now = trans[now][b[i]-'a'];}}}ans = max(ans,sum);}printf("%d\n",ans);
}

转载于:https://www.cnblogs.com/zxhl/p/7616318.html

SPOJ - LCS 后缀自动机入门相关推荐

  1. SPOJ LCS 后缀自动机

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

  2. spoj 1811 LCS 后缀自动机

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

  3. SPOJ NSUBSTR(后缀自动机)

    题目链接:http://www.spoj.com/problems/NSUBSTR/ 题目大意:给你一个字符串s(len(s)<=250000),求f[i](i=1...len(s)),其中f[ ...

  4. HihoCoder - 1441 后缀自动机一·基本概念(模拟,后缀自动机入门好题)

    题目链接:点击查看 题目大意:给出后缀自动机的定义以及各部分的参数,要求模拟后缀自动机的各个部分 题目分析:直接按照后缀自动机的定义模拟就好了,因为字符串的长度只有50,所以可以用n^3的算法暴力,还 ...

  5. 后缀自动机入门/基本概念

    教程链接 (本文为适应自己的理解,对原文做出删改,建议到原文学习) 后缀自动机可以干啥? 后缀自动机(SAM)可以解决许多字符串相关问题.是一个特别nb的数据结构.它可以: 1.在另一个字符串中搜索一 ...

  6. SPOJ 7258 (后缀自动机)

    转载:http://hzwer.com/4492.html 给一个长度不超过90000的串S,每次询问它的所有不同子串中,字典序第K小的,询问不超过500个. 搞出后缀自动机 dp处理出每个点往下走能 ...

  7. SPOJ 1811 LCS [后缀自动机]

    题意: 求两个串的最大连续子串 一个串建SAM,另一个串在上面跑 注意如果走了Suffix Link,sum需要更新为t[u].val+1 Suffix Link有点像失配吧,当前状态s走不了了就到S ...

  8. 【BZOJ2780】【SPOJ】Sevenk Love Oimaster(广义后缀自动机)

    Description 有n个大串和m个询问,每次给出一个字符串s询问在多少个大串中出现过. Solution 广义后缀自动机入门题. 其实就是在插入一个串后将last设为root即可. 然后统计每个 ...

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

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

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

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

最新文章

  1. repeater中后台动态为控件添加属性
  2. [转] 移动前端不得不了解的HTML5 head 头标签
  3. python的进程和线程_Python进程与线程知识
  4. linux服务器搭建_基于LINUX系统的邮件服务器搭建和详细部署(POSTFIX)
  5. mysql数据库创建带-的数据库名
  6. 华尔街英语学习软件_华尔街英语吧啦吧啦聊点啥:语言学习交流至上
  7. python从入门到精通-Python从入门到精通,跟着《这本书》学就够了?
  8. 腾讯新出了一款音乐app,它能代替QQ音乐吗?
  9. 全国各省市区县数据整理
  10. 我的世界java版地狱_我的世界怎么去地狱_Minecraft地狱门建造教程 - 我的世界中文站...
  11. 湖北省211大学计算机分数线,武汉7所211大学湖北省录取分数线2020
  12. 使用Fiona创建Shapefile矢量数据
  13. 中国(西部)云计算中心投产,将成西部规模最大数据中心
  14. 好玩又赚钱的链游有哪些?
  15. ch不是小写英文字母的c语言代码,函数fun的功能是进行字母转换。若形参ch中是小写英文字母,则转换成对应的大写英文字母;若ch中是大写英文字母,则...
  16. uniapp 多语言版本demo in18
  17. 使用Python爬取马蜂窝网站的游记和照片
  18. 为什么院士们纷纷推荐这本书?​
  19. 利用脑电图(EEG)检测自闭症儿童大脑微状态的改变
  20. cpu设计和实现(协处理器hi和lo)

热门文章

  1. 学习数学到底有什么用?
  2. 区块链、ICO,养肥的是开发者和一群黑客
  3. java替代重定向_一个简单的java重定向程序,为什么要恢复System . out 对象,却不要恢复System...
  4. 两分钟实现安全完备的登录模块
  5. 安装freetds小记
  6. 【JS跨域取XML】之——借助AS的URLLoader
  7. HDOJ 1394 Minimum Inversion Number(线段树求逆序数对)
  8. godaddy虚拟主机access数据库中文乱码的解决方法
  9. Spring Boot入门(5)表单验证
  10. 二叉树的递归与非递归