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 ...
随机推荐
- linux安装rabbitmq以及相关的操作命令
1.安装rabbitmqa)进入rabbitmq文件的存放目录b)rpm -ivh rabbitmq-server-3.5.4-1.noarch.rpm2.修改配置cd /etc/rabbitmqcd ...
- 浏览器(或客户端)触发,后台运行php脚本
既我从浏览器这端触发服务器上的php脚本,要想让服务器端的php脚本一直执行,我得把该网页一直开着,这样就达不到我不开电脑不开网页进行爬取的目的,因此查找了些资料,得知 ignore_user_abo ...
- Laravel使用Form(转载)
laravel到了5.1.*以上版本,便没有了illuminate/html类库的支持, 我试着把illuminate/html类库加入了laravel5.2,依然没有用, 但是laravelcoll ...
- 6.cookie、session,localStorage、sessionStorage
必须在服务器下运行 cookie/session 存东西 cookie 时间 过期时间 4k 服务器把一部分数据保存在客户端(浏览器) session 回话 时间 服务器存取用户信息 5M local ...
- solr下载安装
原文查阅:https://www.cnblogs.com/cenwei/p/6527081.html 下载地址(版本众多):http://archive.apache.org/dist/lucene/ ...
- react-redux简单实用
首先了解一个过程,redux 肯定是通过在组件中出发一个方法(事件),我们可以实现一个简单的例子播放和停止播放(写到这今日心情不好,下次继续) redux需要安装 以下依赖:cnpm install ...
- js的小知识7
1.函数都有返回值...... 而方法的本质也是函数,所有也有返回值. Document.getElementById()返回的是获取的标签 getElementByClassName()和getEl ...
- 利用excel模板,将数据填充到excel中
package com.excel;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundExce ...
- 常用邮箱的 IMAP/POP3/SMTP 设置
通过网上查找的资料和自己的总结完成了下面的文章,看完之后相信大家对这三种协议会有更深入的理解.如有错误的地方望指正. POP3 POP3是Post Office Protocol 3的简称,即邮局协议 ...
- javascript 回调 继承
var my = function (name,fn){ alert(name); ...