POJ 2774 Long Long Message (二分 + Hash 求最长公共子串)题解
题意:求最长公共子串
思路:把两个串Hash,然后我们把短的作为LCS的最大可能值,然后二分长度,每次判断这样二分可不可以。判断时,先拿出第一个母串所有len长的子串,排序,然后枚举第二个母串len长度字串,二分查找在第一个母串的子串中存不存在。
代码:
#include<cmath>
#include<stack>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include <iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = + ;
const ull seed = ;
const int INF = 0x3f3f3f3f;
const int MOD = ;
ull hs[maxn], hp[maxn], fac[maxn], q[maxn];
int len1, len2;
char s[maxn], p[maxn];
ull get_hash(ull *h, int l, int r){
return h[r] - h[l - ] * fac[r - l + ];
}
bool check(int len){
int cnt = ;
for(int i = ; i + len - <= len1; i++){
q[cnt++] = get_hash(hs, i, i + len - );
}
sort(q, q + cnt);
for(int i = ; i + len - <= len2; i++){
ull aim = get_hash(hp, i, i + len - );
if(binary_search(q, q + cnt, aim)) return true;
}
return false;
}
int main(){
fac[] = ;
for(int i = ; i < maxn; i++)
fac[i] = fac[i - ] * seed;
while(~scanf("%s%s", s + , p + )){
len1 = strlen(s + );
len2 = strlen(p + );
hs[] = hp[] = ;
for(int i = ; i <= len1; i++)
hs[i] = hs[i - ] * seed + (s[i] - 'a');
for(int i = ; i <= len2; i++)
hp[i] = hp[i - ] * seed + (p[i] - 'a');
int l = , r = min(len1, len2);
int ans = ;
while(l <= r){
int m = (l + r) >> ;
if(check(m)){
l = m + ;
ans = m;
}
else{
r = m - ;
}
}
printf("%d\n", ans);
}
return ;
}
POJ 2774 Long Long Message (二分 + Hash 求最长公共子串)题解的更多相关文章
- poj 2774 后缀数组 两个字符串的最长公共子串
Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 31904 Accepted: 12 ...
- 字符串hash + 二分答案 - 求最长公共子串 --- poj 2774
Long Long Message Problem's Link:http://poj.org/problem?id=2774 Mean: 求两个字符串的最长公共子串的长度. analyse: 前面在 ...
- poj2774 Long Long Message 后缀数组求最长公共子串
题目链接:http://poj.org/problem?id=2774 这是一道很好的后缀数组的入门题目 题意:给你两个字符串,然后求这两个的字符串的最长连续的公共子串 一般用后缀数组解决的两个字符串 ...
- poj 2774 Long Long Message,后缀数组,求最长公共子串 hdu1403
题意:给出两个字符串,求最长公共子串的长度. 题解:首先将两个字符串连在一起,并在中间加一个特殊字符(字串中不存在的)切割,然后两个串的最长公共字串就变成了全部后缀的最长公共前缀.这时就要用到heig ...
- 文本比较算法Ⅱ——Needleman/Wunsch算法的C++实现【求最长公共子串(不需要连续)】
算法见:http://www.cnblogs.com/grenet/archive/2010/06/03/1750454.html 求最长公共子串(不需要连续) #include <stdio. ...
- 求最长公共子串 Longest Common Subsequence
最长公共子串 // Longest Common Subsequence 子串有别于子序列, 子串是连续的, 而子序列可以不连续 /*--------------------------------- ...
- 后缀数组(模板题) - 求最长公共子串 - poj 2774 Long Long Message
Language: Default Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 21 ...
- java求最长公共子串的长度
1这道题目就是给定两个字符串,然后求这两个字符串的最长公共子串的最大长度,假设我的f()方法是来求两个字符串的最大公共子串,从头开始逐一比较,如果相等,则 继续调用这个方法,使得递归的长度+1,如果不 ...
- POJ 题目2774 Long Long Message(后缀数组,求最长公共子串长度)
Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 23696 Accepted: 97 ...
随机推荐
- nvm的安装
安装前可先卸载原来的node, npm, 安装成功后,可用nvm装node 一.用nvm-noinstall.zip安装 1.nvm-windows 下载 https://github.com/cor ...
- python全栈开发 * 23 面向对象 知识点汇总 * 180704
23 面向对象 -----特殊方法 1. isinstance(obj,类名) 判断对象是否是此类实例化或者此类的子类实例化出来的class A:passclass B(A):passb1=B()pr ...
- 常用邮箱的 IMAP/POP3/SMTP 设置
通过网上查找的资料和自己的总结完成了下面的文章,看完之后相信大家对这三种协议会有更深入的理解.如有错误的地方望指正. POP3 POP3是Post Office Protocol 3的简称,即邮局协议 ...
- liunx系统问题总结
1.Unable to locate package错误 解决办法 :输入命令 sudo apt-get update,进行软件的更新
- [qemu] 差分盘使用
我要装好多台同样配置的虚拟机.比如10台CentOS7, 各自有不同的配置. 这样的话装10台kvm虚拟机,特别的浪费空间,image文件相互迁移的话也不方便. 这个时候可以选择差分盘:就是先装一个标 ...
- 2、LwIP协议栈规范翻译——协议层
2.协议层 TCP/IP套件中的协议是以层次的方式设计的,其中每个协议层解决了通信问题的单独部分.这种分层可以用作设计协议实现的指南,因为每个协议可以与另一个分开实现.然而,以严格分层的方式实现协议可 ...
- js之prototype 原型对象
原型对象prototype可以这么理解,是该类的实例对象的模板,每个实例对象都是先复制一份该类的prototype,通过这个可以让类的实例拥有相同的功能 String.prototype.say= ...
- 【Java】NO.83.Tool.1.GlassFish.1.001-【GlassFish 5 安装使用】-
1.0.0 Summary Tittle:[Java]NO.83.Tool.1.GlassFish.1.001-[GlassFish 5 安装使用]- Style:EBook Series:Java ...
- outlook2016用Exchange轻松绑定腾讯企业邮箱
系统版本:Win10 X64 1709 英文版 邮箱:Outlook2016 背景知识: 1.发送邮件均使用SMTP协议(SMTP 全称“Simple Mail Transfer Protocol”, ...
- Deeplab v3+的结构的理解,图像分割最新成果
Deeplab v3+ 结构的精髓: 1.继续使用ASPP结构, SPP 利用对多种比例(rates)和多种有效感受野的不同分辨率特征处理,来挖掘多尺度的上下文内容信息. 解编码结构逐步重构空间信息来 ...