后缀数组2倍增可解。

 #include <cstdio>
#include <cstring>
#include <cstdlib> #define MAXM 28
#define MAXN 100010 int wa[MAXN*];
int wb[MAXN*];
int wv[MAXN*];
int ws[MAXN*];
char s[MAXN];
int str[MAXN*], sa[MAXN*];
int height[MAXN*], rank[MAXN*]; bool cmp(int *r, int a, int b, int l) {
return r[a]==r[b] && r[a+l]==r[b+l];
} void da(int *r, int *sa, int n, int m) {
int i, j, *x = wa, *y = wb, *t;
int p; for (i=; i<m; ++i) ws[i] = ;
for (i=; i<n; ++i) ws[x[i]=r[i]]++;
for (i=; i<m; ++i) ws[i] += ws[i-];
for (i=n-; i>=; --i) sa[--ws[x[i]]] = i;
for (j=, p=; j<n; j*=, m=p) {
for (p=, i=n-j; i<n; ++i) y[p++] = i;
for (i=; i<n; ++i) if (sa[i] >= j) y[p++] = sa[i] - j;
for (i=; i<n; ++i) wv[i] = x[y[i]];
for (i=; i<m; ++i) ws[i] = ;
for (i=; i<n; ++i) ws[wv[i]]++;
for (i=; i<m; ++i) ws[i] += ws[i-];
for (i=n-; i>=; --i) sa[--ws[wv[i]]] = y[i];
for (t=x, x=y, y=t, p=, x[sa[]]=, i=; i<n; ++i)
x[sa[i]] = cmp(y, sa[i-], sa[i], j) ? p-:p++;
}
} void calheight(int *r, int *sa, int n) {
int i, j, k=; for (i=; i<=n; ++i) rank[sa[i]] = i;
for (i=; i<n; height[rank[i++]]=k)
for (k?k--:, j=sa[rank[i]-]; r[i+k]==r[j+k]; ++k)
/*do nothing*/;
} void printRank(int n) {
int i; printf("\nprint rank...\n");
for (i=; i<n; ++i)
printf("%d ", rank[i]);
printf("\n");
} void printSa(int n) {
int i; printf("\nprint sa...\n");
for (i=; i<n; ++i)
printf("%d ", sa[i]);
printf("\n");
} void printHeight(int n) {
int i; printf("\nprint height...\n");
for (i=; i<n; ++i)
printf("%d ", height[i]);
printf("\n");
} int main() {
int l1, l2, l;
int i, j, k;
int ans; #ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
#endif while (scanf("%s", s) != EOF) {
l = ;
for (l1=; s[l1]; l1++)
str[l++] = s[l1] - 'a' + ;
str[l++] = ; // split two strings
scanf("%s", s);
for (l2=; s[l2]; l2++)
str[l++] = s[l2] - 'a' + ;
str[l] = ;
da(str, sa, l+, MAXM);
calheight(str, sa, l);
#ifndef ONLINE_JUDGE
printRank(l+);
printSa(l+);
printHeight(l);
#endif
ans = -;
for (i=; i<=l; ++i) {
if (height[i] > ans) {
if ((sa[i-]<l1 && sa[i]>l1) || (sa[i-]>l1 && sa[i]<l1))
ans = height[i];
}
}
printf("%d\n", ans);
} return ;
}

【HDOJ】1403 Longest Common Substring的更多相关文章

  1. 【SP1812】LCS2 - Longest Common Substring II

    [SP1812]LCS2 - Longest Common Substring II 题面 洛谷 题解 你首先得会做这题. 然后就其实就很简单了, 你在每一个状态\(i\)打一个标记\(f[i]\)表 ...

  2. 【SP1811】LCS - Longest Common Substring

    [SP1811]LCS - Longest Common Substring 题面 洛谷 题解 建好后缀自动机后从初始状态沿着现在的边匹配, 如果失配则跳它的后缀链接,因为你跳后缀链接到达的\(End ...

  3. 【SPOJ】1812. Longest Common Substring II(后缀自动机)

    http://www.spoj.com/problems/LCS2/ 发现了我原来对sam的理解的一个坑233 本题容易看出就是将所有匹配长度记录在状态上然后取min后再对所有状态取max. 但是不要 ...

  4. 【SP1811】 LCS - Longest Common Substring(SAM)

    传送门 洛谷 Solution 考虑他要求的是最长公共子串对吧,那么我们对于一个串建后缀自动机,另一个串在后缀自动机上面跑就是了. 复杂度\(O(n+m)\)的,很棒! 代码实现 代码戳这里

  5. 【后缀数组】【SP1811】 LCS - Longest Common Substring

    题目链接 题意翻译 输入2 个长度不大于250000的字符串,输出这2 个字符串的最长公共子串.如果没有公共子串则输出0 . 思路 求两个串的最长公共子串 代码 #include<iostrea ...

  6. 【SP1811】 LCS - Longest Common Substring(后缀自动机)

    题目链接 对第一个串建出\(SAM\),然后用第二个串去匹配. 如果能往下走就往下走,不能的话就跳parent tree的父亲,直到能走为止.如果跳到\(0\)了还是不能走,重新匹配. #includ ...

  7. hdu 1403 Longest Common Substring(最长公共子字符串)(后缀数组)

    http://acm.hdu.edu.cn/showproblem.php?pid=1403 Longest Common Substring Time Limit: 8000/4000 MS (Ja ...

  8. HDU - 1403 - Longest Common Substring

    先上题目: Longest Common Substring Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  9. HDU 1403 Longest Common Substring(后缀自动机——附讲解 or 后缀数组)

    Description Given two strings, you have to tell the length of the Longest Common Substring of them. ...

随机推荐

  1. web前端面试试题总结---javascript篇

    JavaScript 介绍js的基本数据类型. Undefined.Null.Boolean.Number.String. ECMAScript 2015 新增:Symbol(创建后独一无二且不可变的 ...

  2. MySQL高可用基础之keepalived+双主复制【转】

    环境:MySQL-VIP:192.168.1.3MySQL-master1:192.168.1.1MySQL-master2:192.168.1.2 OS版本:CentOS release 6.4 ( ...

  3. android开发4:Android布局管理器1(线性布局,相对布局RelativeLayout-案例)

    控件类概述 View 可视化控件的基类 属性名称 对应方法 描述 android:background setBackgroundResource(int) 设置背景 android:clickabl ...

  4. c++ map与 qt QMap insert 区别

    当插入相同key的字段时, c++  map 会保留原来的字段, QMap 则会取代原来的字段.

  5. Java基础知识强化之IO流笔记01:异常的概述和分类

     IO流操作的时候会出现很多问题,java中叫作异常,所以我们先介绍一下异常: 1. 程序的异常:Throwable(Throwable类是java中所有异常或错误的超类) (1)严重问题:Error ...

  6. Laravel No such file or directory in /bootstrap/autoload.php on line 17

    具体错误如下: Warning: require(../vendor/autoload.php) [function.require]: failed to open stream: No such ...

  7. Tab标签栏 切换 权威总结

    angular的标签栏,有两种方法实现: 内容全部加载到页面中,再利用ng-show指令. 将每一块要加载的内容做成模板,利用ng-if指令加载. 用bootstrap的tab组件 用angular的 ...

  8. js设置元素的onclick传参方法

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD ...

  9. congos 日期控件的简单使用

    congos 添加html的标签,然后写上js的代码,这段代码的功能是得到前一天的日期. <input type="button" value="查询" ...

  10. 几种常用的Java数据源解决方案

    http://blog.163.com/qqabc20082006@126/blog/static/22928525201041944847653/