【HDOJ】1403 Longest Common Substring
后缀数组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的更多相关文章
- 【SP1812】LCS2 - Longest Common Substring II
[SP1812]LCS2 - Longest Common Substring II 题面 洛谷 题解 你首先得会做这题. 然后就其实就很简单了, 你在每一个状态\(i\)打一个标记\(f[i]\)表 ...
- 【SP1811】LCS - Longest Common Substring
[SP1811]LCS - Longest Common Substring 题面 洛谷 题解 建好后缀自动机后从初始状态沿着现在的边匹配, 如果失配则跳它的后缀链接,因为你跳后缀链接到达的\(End ...
- 【SPOJ】1812. Longest Common Substring II(后缀自动机)
http://www.spoj.com/problems/LCS2/ 发现了我原来对sam的理解的一个坑233 本题容易看出就是将所有匹配长度记录在状态上然后取min后再对所有状态取max. 但是不要 ...
- 【SP1811】 LCS - Longest Common Substring(SAM)
传送门 洛谷 Solution 考虑他要求的是最长公共子串对吧,那么我们对于一个串建后缀自动机,另一个串在后缀自动机上面跑就是了. 复杂度\(O(n+m)\)的,很棒! 代码实现 代码戳这里
- 【后缀数组】【SP1811】 LCS - Longest Common Substring
题目链接 题意翻译 输入2 个长度不大于250000的字符串,输出这2 个字符串的最长公共子串.如果没有公共子串则输出0 . 思路 求两个串的最长公共子串 代码 #include<iostrea ...
- 【SP1811】 LCS - Longest Common Substring(后缀自动机)
题目链接 对第一个串建出\(SAM\),然后用第二个串去匹配. 如果能往下走就往下走,不能的话就跳parent tree的父亲,直到能走为止.如果跳到\(0\)了还是不能走,重新匹配. #includ ...
- hdu 1403 Longest Common Substring(最长公共子字符串)(后缀数组)
http://acm.hdu.edu.cn/showproblem.php?pid=1403 Longest Common Substring Time Limit: 8000/4000 MS (Ja ...
- HDU - 1403 - Longest Common Substring
先上题目: Longest Common Substring Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- HDU 1403 Longest Common Substring(后缀自动机——附讲解 or 后缀数组)
Description Given two strings, you have to tell the length of the Longest Common Substring of them. ...
随机推荐
- AfxMessageBox和MessageBox差别
假设用MFC的话,请尽量使用afxmessagebox,由于这个全局的对话框最安全,也最方便. 可是在WIN32 SDK的情况下仅仅能使用MESSAGEBOX. MessageBox()是Win3 ...
- [Angular 2] Passing Observables into Components with Async Pipe
The components inside of your container components can easily accept Observables. You simply define ...
- C# string.Format谨慎使用
string.Format string.Format在处理文本的时候很有用处,但是在使用占位符的时候一定要注意内容中的特殊字符{}. 示例 string.Format("你好{0},这是{ ...
- Java基础知识强化92:日期工具类的编写和测试案例
1. DateUtil.java,代码如下: package cn.itcast_04; import java.text.ParseException; import java.text.Simpl ...
- git 取消追踪
git rm --cached filePath这个操作不会删除这个文件
- Avast注册以及更新
昨天无聊在网上看Avast,然后下了玩. Avast有三种版本,免费版,网络版,高级版. 下了个高级版,在贴吧和论坛找激活码,发现大部分都没用,最后找了一个许可文件 关于Avast的注册,有在线和离线 ...
- JS类百度的动态提示框思路及完成
参考的代码来自这里: http://www.jb51.net/article/28075.htm 不过说实话,这个网站太烂了,不适合看代码,另外写代码的人是个大牛,但是却没有模块化思想,所以朕不高兴直 ...
- HTML 控件和web控件 OnClientClick和OnClick OnServerClick区别
^_^ 本来对html控件,服务器控件的知识模模糊糊的.今天特地查了相关的知识. 下面是我写代码总结的. 这些事件 主要用于在客户端执行验证,然后决定是否执行服务端事件 (没接触之前就为此 ...
- [c#]asp.net开发微信公众平台(1)数据库设计
开发微信公众平台之前,先去微信官方了解下大概的情况 这里:http://mp.weixin.qq.com/wiki/index.php :看了之后心里大致有数了,开始设计数据库,尽可能的考虑,未考虑到 ...
- ESXi控制台TSM:弥补vSphere Client不足
当vSphere Client不能完成某些任务时,主机的ESXi控制台及其技术支持模式(TSM)可能能派上用场. ESXi控制台允许管理员执行不能通过vSphere Client进行配置的管理任务,比 ...