【POJ 2774】Long Long Message 最长公共子串
还是模板啊,手残&&打成||查错查了1h+TAT
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int N = 2000003; int t1[N], t2[N], c[N];
void st(int *x, int *y, int *sa, int n, int m) {
int i;
for(i = 0; i < m; ++i) c[i] = 0;
for(i = 0; i < n; ++i) ++c[x[y[i]]];
for(i = 1; i < m; ++i) c[i] += c[i - 1];
for(i = n - 1; i >= 0; --i) sa[--c[x[y[i]]]] = y[i];
}
void mkhz(int *a, int *sa, int n, int m) {
int i, j, p, *t, *x = t1, *y = t2;
for(i = 0; i < n; ++i) x[i] = a[i], y[i] = i;
st(x, y, sa, n, m);
for(p = 1, j = 1; p < n; j <<= 1, m = p) {
for(p = 0, i = n - j; i < n; ++i) y[p++] = i;
for(i = 0; i < n; ++i) if (sa[i] >= j) y[p++] = sa[i] - j;
st(x, y, sa, n, m);
for(t = x, x = y, y = t, p = 1, x[sa[0]] = 0, i = 1; i < n; ++i)
x[sa[i]] = y[sa[i]] == y[sa[i - 1]] && y[sa[i] + j] == y[sa[i - 1] + j] ? p - 1 : p++;
}
}
void mkh(int *r, int *sa, int *rank, int *h, int n) {
int i, j, k = 0;
for(i = 1; i <= n; ++i) rank[sa[i]] = i;
for(i = 1; i <= n; h[rank[i++]] = k)
for(k ? --k : 0, j = sa[rank[i] - 1]; r[i + k] == r[j + k]; ++k);
} char s[N];
int a[N], sa[N], h[N], rank[N], n;
int main() {
while(~scanf("%s", s + 1)) {
int tmp = strlen(s + 1);
s[tmp + 1] = '$';
scanf("%s", s + tmp + 2);
int n = strlen(s + 1);
for(int i = 1; i <= n; ++i) a[i] = s[i];
mkhz(a, sa, n + 1, 130);
mkh(a, sa, rank, h, n);
int ans = 0;
++tmp;
for(int i = 2; i <= n; ++i)
if (((tmp < sa[i - 1] && tmp > sa[i]) || (tmp < sa[i] && tmp > sa[i - 1])) && h[i] > ans)
ans = h[i];
printf("%d\n", ans);
}
return 0;
}
Orz
【POJ 2774】Long Long Message 最长公共子串的更多相关文章
- POJ 2774 Long Long Message [ 最长公共子串 后缀数组]
		题目:http://poj.org/problem?id=2774 Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total ... 
- POJ 3080 Blue Jeans 找最长公共子串(暴力模拟+KMP匹配)
		Blue Jeans Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 20966 Accepted: 9279 Descr ... 
- POJ 3450 	Corporate Identity kmp+最长公共子串
		枚举长度最短的字符串的所有子串,再与其他串匹配. #include<cstdio> #include<cstring> #include<algorithm> #i ... 
- 后缀数组(模板题) - 求最长公共子串 - poj 2774 Long Long Message
		Language: Default Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 21 ... 
- poj 2774 Long Long Message,后缀数组,求最长公共子串   hdu1403
		题意:给出两个字符串,求最长公共子串的长度. 题解:首先将两个字符串连在一起,并在中间加一个特殊字符(字串中不存在的)切割,然后两个串的最长公共字串就变成了全部后缀的最长公共前缀.这时就要用到heig ... 
- POJ 2774 Long Long Message (二分 + Hash 求最长公共子串)题解
		题意:求最长公共子串 思路:把两个串Hash,然后我们把短的作为LCS的最大可能值,然后二分长度,每次判断这样二分可不可以.判断时,先拿出第一个母串所有len长的子串,排序,然后枚举第二个母串len长 ... 
- 字符串hash + 二分答案 - 求最长公共子串 --- poj 2774
		Long Long Message Problem's Link:http://poj.org/problem?id=2774 Mean: 求两个字符串的最长公共子串的长度. analyse: 前面在 ... 
- poj 2774 最长公共子串 后缀数组
		Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 25752 Accepted: 10 ... 
- poj 2774 后缀数组 两个字符串的最长公共子串
		Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 31904 Accepted: 12 ... 
随机推荐
- POJ 2653 Pick-up sticks【线段相交】
			题意:n根木棍随意摆放在一个平面上,问放在最上面的木棍是哪些. 思路:线段相交,因为题目说最多有1000根在最上面.所以从后往前处理,直到木棍没了或者最上面的木棍的总数大于1000. #include ... 
- ubuntu不能登录图形用户界面,游客身份可登陆,命令行可登陆
			ubuntu是13.04版本,我猜其他的版本解决办法大概也一样.当开机进入登陆界面后我们输入密码后并没有进入应该进入的图形用户界面,而是进入一个命令行界面并且一闪而过又回到了登录界面,而已游客的身份却 ... 
- 方便!C++ builder快捷键大全
			Clipboard control (default) Ctrl+Ins Edit|Copy Shift+Del Edit|Cut Shift+Ins Edit|Paste Ctrl+C Edit|C ... 
- 转: VMware 安装mac osx 10.11 安装步骤(一)(from伟东)
			http://blog.csdn.net/soachenshui/article/details/49251513 
- androidSDK无法更新的解决方法之一
			方法来源于: http://www.eoeandroid.com/thread-281075-1-1.html 试试这个,能解决国内访问Google服务器的困难启动 Android SDK Manag ... 
- js获取样式的兼容写法
			var currentStyle = function(element){ return element.currentStyle || document.defaultView.getCompute ... 
- 深入理解Linux修改hostname(转载)
			http://www.cnblogs.com/kerrycode/p/3595724.html http://www.centoscn.com/CentOS/config/2014/1031/4039 ... 
- 阿里云日志api创建logStore
			, shardCount = }); string date = FormatRfc822Date(time); string con ... 
- matrix-tree
			学一发matrix-tree 原来bzoj1016这题是暴搜+玄学并查集过的-数据弱怪我咯 首先matrix-tree需要度数矩阵D,就是说当i=j时D[i][j]为i的度数,否则为0. 还有邻接矩阵 ... 
- 正在编译转换: 未能找到元数据文件 EntityFramework.dll
			错误 1 正在编译转换: 未能找到元数据文件“C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\..\IDE\Enti ... 
