3160 最长公共子串

 
题目描述 Description

给出两个由小写字母组成的字符串,求它们的最长公共子串的长度。

输入描述 Input Description

读入两个字符串

输出描述 Output Description

输出最长公共子串的长度

样例输入 Sample Input
  1. yeshowmuchiloveyoumydearmotherreallyicannotbelieveit
    yeaphowmuchiloveyoumydearmother
样例输出 Sample Output

27

数据范围及提示 Data Size & Hint

单个字符串的长度不超过100000

【思路】

  SAM求LCS

【代码】

  1. #include<cstdio>
  2. #include<cstring>
  3. using namespace std;
  4.  
  5. const int N = *1e5+;
  6.  
  7. char s[N];
  8. int sz,root,last,fa[N],ch[N][],l[N],n;
  9.  
  10. void add(int x) {
  11. int c=s[x]-'a';
  12. int p=last,np=++sz; last=np;
  13. l[np]=x+;
  14. for(;p&&!ch[p][c];p=fa[p]) ch[p][c]=np;
  15. if(!p) fa[np]=root;
  16. else {
  17. int q=ch[p][c];
  18. if(l[p]+==l[q]) fa[np]=q;
  19. else {
  20. int nq=++sz; l[nq]=l[p]+;
  21. memcpy(ch[nq],ch[q],sizeof(ch[q]));
  22. fa[nq]=fa[q];
  23. fa[np]=fa[q]=nq;
  24. for(;p&&q==ch[p][c];p=fa[p]) ch[p][c]=nq;
  25. }
  26. }
  27. }
  28. void build() {
  29. root=last=++sz;
  30. scanf("%s",s);
  31. n=strlen(s);
  32. for(int i=;i<n;i++) add(i);
  33. }
  34. void lcs() {
  35. scanf("%s",s);
  36. n=strlen(s);
  37. int p=root,ans=,len=;
  38. for(int i=;i<n;i++) {
  39. int c=s[i]-'a';
  40. if(ch[p][c]) { len++; p=ch[p][c]; }
  41. else {
  42. for(;p&&!ch[p][c];p=fa[p]);
  43. if(!p) { p=root; len=; }
  44. else {
  45. len=l[p]+; p=ch[p][c];
  46. }
  47. }
  48. if(len>ans) ans=len;
  49. }
  50. printf("%d",ans);
  51. }
  52.  
  53. int main() {
  54. build();
  55. lcs();
  56. return ;
  57. }

codevs 3160 最长公共子串(SAM)的更多相关文章

  1. codevs 3160 最长公共子串

    3160 最长公共子串 http://codevs.cn/problem/3160/  时间限制: 2 s  空间限制: 128000 KB   题目描述 Description 给出两个由小写字母组 ...

  2. Codevs 3160 最长公共子串(后缀数组)

    3160 最长公共子串 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给出两个由小写字母组成的字符串,求它们的最长公共子串的长 ...

  3. codevs 3160 最长公共子串 后缀自动机

    http://codevs.cn/problem/3160/ 后缀自动机板子题,匹配的时候要注意如果到一个点失配向前匹配到一个点时,此时的tmp(当前匹配值)为t[j].len+1而不是t[t[j]. ...

  4. CODE【VS】3160 最长公共子串 (后缀自动机)

    3160 最长公共子串 题目描述 Description 给出两个由小写字母组成的字符串,求它们的最长公共子串的长度. 输入描述 Input Description 读入两个字符串 输出描述 Outp ...

  5. CODE【VS】 3160 最长公共子串 (后缀数组)

    3160 最长公共子串 题目描述 Description 给出两个由小写字母组成的字符串,求它们的最长公共子串的长度. 输入描述 Input Description 读入两个字符串 输出描述 Outp ...

  6. 【wikioi】3160 最长公共子串(后缀自动机)

    http://codevs.cn/problem/3160/ sam的裸题...(之前写了spoj上另一题sam的题目,但是spoj被卡评测现在还没评测完QAQ打算写那题题解时再来详细介绍sam的.. ...

  7. Codevs 1425 最长公共子串

    1425 最长公共子串  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 青铜 Bronze 题解       题目描述 Description 输入N(2<=N<= ...

  8. 【SAM】codevs3160-最长公共子串

    [题目大意] 求两个字符串的最长公共子串. [思路] 对第一个字符串建立后缀自动机,第二个字符串去匹配.cnt记录当前最长公共子串的长度,而ret记录答案. p代表位置指针,初始在rt位置. 对于第二 ...

  9. SPOJ 1811 Longest Common Substring (后缀自动机第一题,求两个串的最长公共子串)

    题目大意: 给出两个长度小于等于25W的字符串,求它们的最长公共子串. 题目链接:http://www.spoj.com/problems/LCS/ 算法讨论: 二分+哈希, 后缀数组, 后缀自动机. ...

随机推荐

  1. IOC----LightInject

    开源项目 引入 LightInject.cs 默认服务 new ServiceContainer 注册跟获取获取服务 container.Register<IFoo, Foo>();con ...

  2. [PHP]MemCached高级缓存

    Memcache Win32 的安装下载:Memcache Win32 [www.php100.com]   [www.jehiah.cz/projects/memcached-win32/] 1.解 ...

  3. <三> SQL 基础

    SQL查询的一般形式,以及被逻辑处理的顺序 (8) select (9) distinct (11) <TOP_specification> <select_list> (1) ...

  4. C# 操作mongodb 分组

    c#操作mongodb的分组的简单例子: 1.首先要下载c#对应的mongodb驱动,官方下载地址:https://github.com/mongodb/mongo-csharp-driver/rel ...

  5. 取得inputStream的长度

    1.网络下载文件 URL url = new URL(strUrl); HttpURLConnection httpconn = (HttpURLConnection)url.openConnecti ...

  6. Js通过原型继承创建子类

    //定义一个有两个方法的类 function Person(){} Person.prototype.married = function(){}; Person.prototype.unmerrie ...

  7. JAVA File常用的API介绍

    package coreJava; import java.io.File; import java.io.IOException; public class FileDemo { public st ...

  8. Searching for Approximate Nearest Neighbours

    Searching for Approximate Nearest Neighbours Nearest neighbour search is a common task: given a quer ...

  9. Codeforces Round #230 (Div. 2) C Blocked Points

    题目链接 题意 : 给你一个半径为n的圆,圆里边还有圆上都有很多整点,让你找出与圆外的任意一个整点距离等于1的点. 思路 :这个题可以用枚举,画个图就发现了,比如说先数第一象限的,往下往右找,还可以找 ...

  10. Maven引入依赖后自动下载并关联源码(Source)

    好多用 Maven 的时候会遇到这样一个棘手的问题: 就是添加依赖后由于没有下载并关联源码,导致自动提示无法出现正确的方法名,而且不安装反编译器的情况下不能进入方法内部看具体实现 . 其实 eclip ...