后缀数组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. Context中嵌套<Environment>元素

    环境条目  可以在Context中嵌套<Environment>元素,配置命名的值,这些值作为环境条目资源(Environment Entry Resource),对整个web应用可见.比 ...

  2. motan源码分析二:使用spi机制进行类加载

    在motan的源码中使用了很多的spi机制进行对象的创建,下面我们来具体分析一下它的实现方法. 1.在实际的jar包的\META-INF\services目录中引入相关的文件,例如下图中,我解压了co ...

  3. 怎样将关系型数据表转换至hbase数据表

    首先须要把关系型数据库的数据表的数据添加由 "纵向延伸",转变为HBase数据表的"横向延伸" 一.Hbase的存储结构 a)      HBase以表(HTa ...

  4. RDF Database和NoSql DB

    一篇比较老的文章,介绍了RDF Database和其他一些分类的NoSql DB http://blog.datagraph.org/2010/04/rdf-nosql-diff

  5. js通用对象数组冒牌排序

    数组对象通用 function sort(data, sortFiled, orderby) { var result = data, temp; for (var i = 0; i < res ...

  6. spring07 JDBC

    1.创建对应的数据库 2.在MyEclipse中创建项目  引入需要的jar包 3.创建数据访问层 public interface StudentDao { //新增学生 int addStuden ...

  7. bootstrap字体图标

    bootstrap字体图标 http://v3.bootcss.com/components/ <!DOCTYPE HTML> <html> <head> < ...

  8. html行内元素 和 块状元素 总结

    块状元素 address - 地址blockquote - 块引用center - 举中对齐块dir - 目录列表div - 常用块级容易,也是CSS layout的主要标签dl - 定义列表fiel ...

  9. java里面List和Array的区别是什么?

    java里面的List和Array的区别是什么? 1:数组是定长,list是自动增长.2:数组效率高,list效率低.总结:数组牺牲功能增加效率,list牺牲效率增加功能. http://bbs.cs ...

  10. Wcf+EF框架搭建实例

    一.最近在使用Wcf创建数据服务,但是在和EF框架搭建数据访问时遇到了许多问题 下面是目前整理的基本框架代码,经供参考使用,源代码地址:http://git.oschina.net/tiama3798 ...