poj 2774 字符串哈希求最长公共子串
Long Long Message
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <stack>
#include <cmath>
#include <map>
#include <string>
#define LL long long
#define ULL unsigned long long
using namespace std;
const int N = 1e5+10;
ULL hash1[N],hash2[N],p[N];
int seed = 131;
char sa[N],sb[N];
void init()
{
p[0] = 1;
for(int i = 1; i <= 100000; i++)
{
p[i] = p[i-1]*seed;
}
}
void hashs(char s[],ULL hashn[])
{
int len = strlen(s+1);
hashn[0] = 0;
hashn[1] = s[1]-'A'+1;
for(int i = 2; i <= len; i++)
hashn[i] = hashn[i-1]*seed + (s[i]-'A'+1);
}
ULL getHash(int pos,int len, ULL hashn[]) //获取pos位置起长度为len的子字符串哈希值
{
//printf("hash: %ul\n",hashn[pos+len-1] - hashn[pos-1]*p[len]);
return hashn[pos+len-1] - hashn[pos-1]*p[len];
}
bool check(int len, int la,int lb)
{
vector<ULL> bin;
for(int i = len; i <= la; i++)
bin.push_back(getHash(i-len+1,len,hash1));
sort(bin.begin(),bin.end());
for(int i = len; i <= lb; i++)
{
ULL temp = getHash(i-len+1,len,hash2);
if(binary_search(bin.begin(),bin.end(),temp))
return true;
}
return false;
}
void solve()
{
init();
while(~scanf("%s %s",sa+1,sb+1))
{
hashs(sa,hash1);
hashs(sb,hash2);
int la = strlen(sa+1);
int lb = strlen(sb+1);
int ans = 0;
int lf = 1,mid;
int rt = min(la,lb);
while(lf <= rt)
{
mid = (lf+rt)/2;
if(check(mid,la,lb))
{
ans = mid;
lf = mid+1;
}
else
{
rt = mid-1;
}
}
printf("%d\n",ans);
}
}
int main(void)
{
solve();
return 0;
}
poj 2774 字符串哈希求最长公共子串的更多相关文章
- 【POJ 2774】Long Long Message 最长公共子串
还是模板啊,手残&&打成||查错查了1h+TAT #include<cstdio> #include<cstring> #include<algorith ...
- poj 2774 Long Long Message,后缀数组,求最长公共子串 hdu1403
题意:给出两个字符串,求最长公共子串的长度. 题解:首先将两个字符串连在一起,并在中间加一个特殊字符(字串中不存在的)切割,然后两个串的最长公共字串就变成了全部后缀的最长公共前缀.这时就要用到heig ...
- POJ 2774 Long Long Message (二分 + Hash 求最长公共子串)题解
题意:求最长公共子串 思路:把两个串Hash,然后我们把短的作为LCS的最大可能值,然后二分长度,每次判断这样二分可不可以.判断时,先拿出第一个母串所有len长的子串,排序,然后枚举第二个母串len长 ...
- 求最长公共子串 Longest Common Subsequence
最长公共子串 // Longest Common Subsequence 子串有别于子序列, 子串是连续的, 而子序列可以不连续 /*--------------------------------- ...
- 文本比较算法Ⅱ——Needleman/Wunsch算法的C++实现【求最长公共子串(不需要连续)】
算法见:http://www.cnblogs.com/grenet/archive/2010/06/03/1750454.html 求最长公共子串(不需要连续) #include <stdio. ...
- 字符串hash + 二分答案 - 求最长公共子串 --- poj 2774
Long Long Message Problem's Link:http://poj.org/problem?id=2774 Mean: 求两个字符串的最长公共子串的长度. analyse: 前面在 ...
- 后缀数组(模板题) - 求最长公共子串 - poj 2774 Long Long Message
Language: Default Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 21 ...
- poj2774 Long Long Message 后缀数组求最长公共子串
题目链接:http://poj.org/problem?id=2774 这是一道很好的后缀数组的入门题目 题意:给你两个字符串,然后求这两个的字符串的最长连续的公共子串 一般用后缀数组解决的两个字符串 ...
- java求最长公共子串的长度
1这道题目就是给定两个字符串,然后求这两个字符串的最长公共子串的最大长度,假设我的f()方法是来求两个字符串的最大公共子串,从头开始逐一比较,如果相等,则 继续调用这个方法,使得递归的长度+1,如果不 ...
随机推荐
- json对象数组的创建、遍历、添加、删除、修改、js的splice()用法
本文链接:https://blog.csdn.net/houfengfei668/article/details/79843625 )第二种方式:手动构造json对象数组 )for )用splice方 ...
- YARN设计思路
- 校园商铺-2项目设计和框架搭建-10验证controller
1.新建package:com.csj2018.o2o.web.superadmin 2.建立AreaController.java package com.csj2018.o2o.web.super ...
- Model ModelMap ModelAndView
前言 Spring MVC在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器. 如果方法的入参为ModelMap,Model,Map类型,Spring MVC会将隐含模型的引用传递给这些入参. ...
- 0920CSP-S模拟测试赛后总结
依旧挂了. 这次出题人十分良心.白送了180分……于是我没有拿到.130分rank43滚粗了. T1是道sbdp.然而我死想哈希.然后就死在哈希上了. 我简直是个傻子.之前考了几次字符串的题可以用哈希 ...
- 锁定文件失败 打不开磁盘“D:\vms\S1\CentOS 64 位.vmdk”或它所依赖的某个快照磁盘(强制关机后引起的问题)
电脑强制关机后,centos系统启动失败,报异常:锁定文件失败 打不开磁盘“D:\vms\S1\CentOS 64 位.vmdk”或它所依赖的某个快照磁盘.解决办法:进入D:\vms\S1目录,删除下 ...
- 三模数NTT模板
求两个多项式的卷积对任意数p取模 两个好记的FNT模数: 5*2^25+1 7*2^26+1 原根都为3 //Achen #include<algorithm> #include<i ...
- 固定定位fixed,绝对定位absolute,相对定位relative;以及overflow
固定定位position:fixed /*固定定位 1.定位属性值:fixed 2.在页面中不再占位(浮起来了) 3.一旦定位后,定位的布局方位 top.bottom.left.right都能参与布局 ...
- idae for mac部分背景色修改收集
文章目录 所有字体默认颜色 终端背景色 行数line number背景色 line number颜色 编码区背景色 光标所在行背景色 未被使用的变量.方法或者类 控制台相关 选中文字的背景色 选中和未 ...
- 豌豆荚Redis集群方案:Codis
Codis简介 Codis是一个分布式Redis解决方案,对于上层的应用来说,连接到CodisProxy和连接原生的RedisServer没有明显的区别(不支持的命令列表),上层应用可以像使用单机的R ...