砂金听说了你在学字符串,于是在CLOI里出了道题给你


P3667 Bovine Genomics

题链:洛谷 hzoi提高

\(hash\)基础题。

思路是二分答案,\(check\)中比较每一个区间字串的\(hash\)值是否相等。

比较的时候可以用\(set\)或\(map\)。

\(set\)的好处在于无重元素,判断时先将\(a\)串中区间子串的哈希值放入数组,再用\(find\)函数,每次寻找\(b\)串的区间子串的哈希值是否出现过。我个人用的\(set\),代码在下面。

\(map\)的话写起来差不多,值类型设为\(bool\),每次直接判断\(true\,or\,false\)即可。

代码如下:

map<ull,bool>m;
bool check(int len)
{
int re=0;
for(int i=1;i+len-1<=m;i++)
{
bool kk=false;
m.clear();
int j=i+len-1;
fo(k,1,n)
m[Aget_hash(i,j,k,1)]=true;
fo(k,1,n)
if(m[Aget_hash(i,j,k,0)])
{
kk=true;
break;
}
if(!kk)
{
re=1;
break;
}
}
return re;
}

完整代码:

所有
#include<bits/stdc++.h>
#define fo(x,y,z) for(register int (x)=(y);(x)<=(z);(x)++)
#define fu(x,y,z) for(register int (x)=(y);(x)>=(z);(x)--)
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
namespace Dr
{
inline int qr()
{
char ch=getchar();int x=0,f=1;
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<3)+(x<<1)+(ch^48);
return x*f;
}
inline void qw(ull x)
{
if(!x)
return;
qw(x/10);
putchar(x%10+'0');
}
}
#define qr qr()
using namespace Dr;
const int Ratio=0;
const int N=1005;
const int maxi=INT_MAX;
int lena,lenb,n,m;
ull p[N],ha[N][N],hb[N][N];
char a[N][N],b[N][N];
ull base=233,ans;
namespace Acheronhash
{
void Aprepare()
{
p[0]=1;
fo(i,1,500)
p[i]=p[i-1]*base;
}
ull Aget_hash(int l,int r,int id,int x)
{
if(x)
return ha[id][r]-ha[id][l-1]*p[r-l+1];
else
return hb[id][r]-hb[id][l-1]*p[r-l+1];
}
// ull Aget_s(int l,int r,int x)
// {
// return Aget_hash(l,x-1)*p[r-x]+Aget_hash(x+1,r);
// }
ull Aget_hashall(char c[])
{
int len=strlen(c);
ull ans=0;
fo(i,0,len-1)
ans=ans*base+(ull)c[i];
return ans;
}
void Aget_hasheverya(int id)
{
fo(i,1,m)
ha[id][i]=ha[id][i-1]*base+a[id][i];
}
void Aget_hasheveryb(int id)
{
fo(i,1,m)
hb[id][i]=hb[id][i-1]*base+b[id][i];
}
}
using namespace Acheronhash;
set<ull>f;
bool check(int len)
{
int re=0;
for(int i=1;i+len-1<=m;i++)
{
bool kk=false;
f.clear();
int j=i+len-1;
fo(k,1,n)
f.insert(Aget_hash(i,j,k,1));
fo(k,1,n)
if(f.find(Aget_hash(i,j,k,0))!=f.end())
{
kk=true;
break;
}
if(!kk)
{
re=1;
break;
}
}
return re;
}
int main()
{
Aprepare();
n=qr,m=qr;
fo(i,1,n)
{
scanf("%s",a[i]+1);
Aget_hasheverya(i);
}
fo(i,1,n)
{
scanf("%s",b[i]+1);
Aget_hasheveryb(i);
}
int l=1,r=m;
while(l<=r)
{
int mid=(l+r)>>1;
if(check(mid))
ans=mid,r=mid-1;
else
l=mid+1;
}
printf("%lld\n",ans);
return Ratio;
}
或一无所有


完结撒花

P3667 Bovine Genomics Hash+二分题解的更多相关文章

  1. 洛谷 [USACO17OPEN]Bovine Genomics G奶牛基因组(金) ———— 1道骗人的二分+trie树(其实是差分算法)

    题目 :Bovine Genomics G奶牛基因组 传送门: 洛谷P3667 题目描述 Farmer John owns NN cows with spots and NN cows without ...

  2. 【BZOJ】1014: [JSOI2008]火星人prefix(splay+hash+二分+lcp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1014 题意:支持插入一个字符.修改一个字符,查询lcp.(总长度<=100000, 操作< ...

  3. 【bzoj1014】[JSOI2008]火星人prefix Splay+Hash+二分

    题目描述 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 8 9 10 ...

  4. LOJ#6387 「THUPC2018」绿绿与串串 / String (Manacher || hash+二分)

    题目描述 绿绿和 Yazid 是好朋友.他们在一起做串串游戏. 我们定义翻转的操作:把一个串以最后一个字符作对称轴进行翻转复制.形式化地描述就是,如果他翻转的串为 RRR,那么他会将前 ∣R∣−1个字 ...

  5. POJ 1743 Musical Theme (字符串HASH+二分)

    Musical Theme Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 15900   Accepted: 5494 De ...

  6. Codeforces 1090J $kmp+hash+$二分

    题意 给出两个字符串\(s\)和\(t\),设\(S\)为\(s\)的任意一个非空前缀,\(T\)为\(t\)的任意一个非空前缀,问\(S+T\)有多少种不同的可能. Solution 看了一圈,感觉 ...

  7. bzoj1014: [JSOI2008]火星人prefix(splay+hash+二分)

    题目大意:一个字符串三个操作:①求两个后缀的LCP②插入一个字符③修改一个字符. 前几天刚学了hash+二分求lcp,就看到这题. 原来splay还能这么用?!原来splay模板这么好写?我以前写的s ...

  8. bnuoj 34990(后缀数组 或 hash+二分)

    后缀数组倍增算法超时,听说用3DC可以勉强过,不愿写了,直接用hash+二分求出log(n)的时间查询两个字符串之间的任意两个位置的最长前缀. 我自己在想hash的时候一直在考虑hash成数值时MOD ...

  9. 洛谷 P3670 [USACO17OPEN]Bovine Genomics S奶牛基因组(银)

    P3670 [USACO17OPEN]Bovine Genomics S奶牛基因组(银) 题目描述 Farmer John owns NN cows with spots and NN cows wi ...

  10. 140. 后缀数组(hash + 二分 / 后缀数组)

    题目链接 : https://www.acwing.com/problem/content/description/142/ Hash + 二分 #include <bits/stdc++.h& ...

随机推荐

  1. 理解持续测试,才算理解DevOps

    软件产品的成功与否,在很大程度上取决于对市场需求的及时把控,采用DevOps可以加快产品交付速度,改善用户体验,从而有助于保持领先于竞争对手的优势. 作为敏捷开发方法论的一种扩展,DevOps强调开发 ...

  2. .NET Emit 入门教程:第六部分:IL 指令:5:详解 ILGenerator 指令方法:创建实例指令

    前言: 上上篇介绍了 IL 指令的分类以及参数加载指令,该加载指令以 Ld 开头,将参数加载到栈中,以便于后续执行操作命令. 上一篇介绍参数存储指令,其指令以 St 开头,将栈中的数据,存储到指定的变 ...

  3. Qt加Opencv实现 梯度矫正 功能

    废话: 有时候我们是从物品的斜上方拍摄的图片,看起来不直观,需要把视角拉正,这样的一个操作就叫做 梯度矫正,需要用到的技术是 Opencv 的 透视变换. 这个只是一个简单的演示demo,如果完善一下 ...

  4. HarmonyOS线上Codelabs系列挑战赛第二期:调用三方库,制作酷炫的视觉效果

      HarmonyOS线上Codelabs系列挑战赛正如火如荼进行中,开发者们可以通过体验基于HarmonyOS特性和能力的应用开发,快速构建有趣.有用的应用程序.火速加入,与众多开发者一起碰撞想法, ...

  5. Mysql之SQL语句初级用法

    前言 本文通过简单的示例去了解Mysql的DDL.DML.DCL的语句用法. 一.DDL语句 DDL(Data Definition Language)语句: 数据定义语言,主要是进行定义/改变表的结 ...

  6. 【笔记】go语言--(Slice)切片的概念

    go--(Slice)切片的概念 //切片是什么,定义一个arr,定义一个s为arr中的2到6,这个s就是一个切片 arr := [...]int{0,1,2,3,4,5,6,7} s := arr[ ...

  7. 力扣182(java&python)-数组元素积的符号(简单)

    题目: 已知函数 signFunc(x) 将会根据 x 的正负返回特定值: 如果 x 是正数,返回 1 .如果 x 是负数,返回 -1 .如果 x 是等于 0 ,返回 0 .给你一个整数数组 nums ...

  8. 力扣394(java)-字符串解码(中等)

    题目: 给定一个经过编码的字符串,返回它解码后的字符串. 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次.注意 k 保证为正整数 ...

  9. 力扣400(java)-第N位数字(中等)

    题目: 给你一个整数 n ,请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...] 中找出并返回第 n 位上的数字. 示例 1: 输入:n = 3输出: ...

  10. PolarDB-X源码解读系列:DML之Insert流程

    简介: Insert类的SQL语句的流程可初略分为:解析.校验.优化器.执行器.物理执行(GalaxyEngine执行).本文将以一条简单的Insert语句通过调试的方式进行解读. 在阅读本文之前,强 ...