题目描述

Farmer John owns Ncows with spots and N cows without spots. Having just completed a course in bovine

genetics, he is convinced that the spots on his cows are caused by mutations in the bovine genome.A

t great expense, Farmer John sequences the genomes of his cows. Each genome is a string of length Mb

uilt from the four characters A, C, G, and T. When he lines up the genomes of his cows, he gets a ta

ble like the following, shown here for N=3 and M=8:

Positions: 1 2 3 4 5 6 7 8

Spotty Cow 1: A A T C C C A T

Spotty Cow 2: A C T T G C A A

Spotty Cow 3: G G T C G C A A

Plain Cow 1: A C T C C C A G

Plain Cow 2: A C T C G C A T

Plain Cow 3: A C T T C C A T

Looking carefully at this table, he surmises that the sequence from position 2 through position 5 is

sufficient to explain spottiness. That is, by looking at the characters in just these these positio

ns (that is, positions 2…5), Farmer John can predict which of his cows are spotty and which are not

. For example, if he sees the characters GTCG in these locations, he knows the cow must be spotty.Pl

ease help FJ find the length of the shortest sequence of positions that can explain spottiness.

给定n个A串和n个B串,长度均为m,求一个最短的区间[l,r]

使得不存在一个A串a和一个B串b,使得a[l,r]=b[l,r]

n,m≤500


输入格式

The first line of input contains N(1≤N≤500) and M (3≤M≤500). The next N lines each contain a str

ing of M characters; these describe the genomes of the spotty cows. The final Nlines describe the ge

nomes of the plain cows. No spotty cow has the same exact genome as a plain cow.


输出格式

Please print the length of the shortest sequence of positions that is sufficient to explain spottine

ss. A sequence of positions explains spottiness if the spottiness trait can be predicted with perfec

t accuracy among Farmer John's population of cows by looking at just those locations in the genome.


样例输入

3 8

AATCCCAT

ACTTGCAA

GGTCGCAA

ACTCCCAG

ACTCGCAT

ACTTCCAT


样例输出

4


提示

没有写明提示


题目来源

Gold

题解

我的做法是\(O(nmlog^2n)\)的。

先把字符串hash掉,然后这个判断可行一看就知道是可以二分的。那就二分一波答案。判断那里,考虑用set来维护相同hash值。

枚举长度为x(二分的值)的区间,然后将A串里面这个区间的hash值塞进set里面。对每个B串在set里面find一下这个字串有没有出现过即可。

#include <bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define il inline
#define ull unsigned long long namespace io { #define in(a) a = read()
#define out(a) write(a)
#define outn(a) out(a), putchar('\n') #define I_int ll
inline I_int read() {
I_int x = 0, f = 1;
char c = getchar();
while (c < '0' || c > '9') {
if (c == '-') f = -1;
c = getchar();
}
while (c >= '0' && c <= '9') {
x = x * 10 + c - '0';
c = getchar();
}
return x * f;
}
char F[200];
inline void write(I_int x) {
if (x == 0) return (void) (putchar('0'));
I_int tmp = x > 0 ? x : -x;
if (x < 0) putchar('-');
int cnt = 0;
while (tmp > 0) {
F[cnt++] = tmp % 10 + '0';
tmp /= 10;
}
while (cnt > 0) putchar(F[--cnt]);
}
#undef I_int }
using namespace io; using namespace std; #define N 510
#define base 13131 int n = read(), m = read();
char s[N][N], t[N][N];
ull h1[N][N], h2[N][N], p[N];
set<ull>S; ull get(ull *h, int l, int r) {
return h[r] - h[l-1] * p[r-l+1];
} bool check(int x) {
bool ans = 0;
for(int l = 1; l + x - 1 <= m; ++l) {
int r = l + x - 1, flag = 0;
S.clear();
for(int i = 1; i <= n; ++i) {
S.insert(get(h1[i], l, r));
}
for(int i = 1; i <= n; ++i) {
if(S.find(get(h2[i], l, r)) != S.end()) {
flag = 1;
break;
}
}
if(!flag) {
ans = 1;
break;
}
}
return ans;
} int main() {
for(int i = 1; i <= n; ++i) scanf("%s",s[i]+1);
for(int i = 1; i <= n; ++i) scanf("%s",t[i]+1);
p[0] = 1;
for(int i = 1; i <= m; ++i) p[i] = p[i - 1] * base;
for(int i = 1; i <= n; ++i) {
for(int j = 1; j <= m; ++j) h1[i][j] = h1[i][j-1]*base+(ull)s[i][j];
for(int j = 1; j <= m; ++j) h2[i][j] = h2[i][j-1]*base+(ull)t[i][j];
}
int l = 1, r = m, ans = m;
while(l <= r) {
int mid = (l + r) >> 1;
if(check(mid)) ans = mid, r = mid - 1;
else l = mid + 1;
}
outn(ans);
return 0;
}

BZOJ4779: [Usaco2017 Open]Bovine Genomics的更多相关文章

  1. [BZOJ4779] [Usaco2017 Open]Bovine Genomics(hash + 二分)

    传送门 网上的题解: 枚举左端点,二分右端点位置,最后所有左端点的答案取最小值 我的题解... 二分答案,枚举左端点,看看是否有解.. 好像和上面是反的,但是思路没问题 过程用hash判重 #incl ...

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

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

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

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

  4. 【NOIP模拟】【USACO】 Bovine Genomics

    Description 给定两个字符串集合A,B,均包含N个字符串,长度均为M,求一个最短的区间[l,r],使得不存在字符串\(a\in A,b\in B,\)且\(a[l,r]=b[l,r]\) , ...

  5. [USACO]Bovine Genomics

    Description 给定两个字符串集合A,B,均包含N个字符串,长度均为M,求一个最短的区间[l,r],使得不存在字符串\(a\in A,b\in B,\)且\(a[l,r]=b[l,r]\) , ...

  6. USACO比赛题泛刷

    随时可能弃坑. 因为不知道最近要刷啥所以就决定刷下usaco. 优先级排在学习新算法和打比赛之后. 仅有一句话题解.难一点的可能有代码. 优先级是Gold>Silver.Platinum刷不动. ...

  7. 「刷题笔记」哈希,kmp,trie

    Bovine Genomics 暴力 str hash+dp 设\(dp[i][j]\)为前\(i\)组匹配到第\(j\)位的方案数,则转移方程 \[dp[i][j+l]+=dp[i-1][j] \] ...

  8. 「学习笔记」字符串基础:Hash,KMP与Trie

    「学习笔记」字符串基础:Hash,KMP与Trie 点击查看目录 目录 「学习笔记」字符串基础:Hash,KMP与Trie Hash 算法 代码 KMP 算法 前置知识:\(\text{Border} ...

  9. bzoj 4780: [Usaco2017 Open]Modern Art 2

    4780: [Usaco2017 Open]Modern Art 2 Time Limit: 10 Sec  Memory Limit: 128 MB Description Having becom ...

随机推荐

  1. spring-boot(三) HowTo

    Spring Boot How To 1. 简介 本章节将回答一些常见的"我该怎么做"类型的问题,这些问题在我们使用spring Boot时经常遇到.这绝不是一个详尽的列表,但它覆 ...

  2. TensorRT层和每个层支持的精度模式

    下表列出了TensorRT层和每个层支持的精确模式.它还列出了该层在深度学习加速器(DLA)上运行的能力.有关附加约束的更多信息,请参见 DLA Supported Layershttps://doc ...

  3. 【WordCount】实现(重做)

    Gitee项目地址: https://gitee.com/LIUJIA6/wordcount_implementation 需求说明: WordCount的需求可以概括为:对程序设计语言源文件统计字符 ...

  4. python-颜色显示

    格式:\033[显示方式;字体色;背景色m......[\033[0m] ------------------------------------------- 字体色 | 背景色 | 颜色描述 -- ...

  5. 3、LwIP协议栈规范翻译——概述

    3.概述 像许多其他TCP/IP实现一样,分层协议设计已经成为设计lwIP实现的指南.每个协议实现为自己的模块,其中几个功能充当每个协议的入口点.尽管协议层是单独实现的,一些层却不全是,正如前面所叙述 ...

  6. 2、LwIP协议栈规范翻译——协议层

    2.协议层 TCP/IP套件中的协议是以层次的方式设计的,其中每个协议层解决了通信问题的单独部分.这种分层可以用作设计协议实现的指南,因为每个协议可以与另一个分开实现.然而,以严格分层的方式实现协议可 ...

  7. Redis入门到高可用(二十)——Redis Cluster

    一.呼唤集群 二.数据分布概论      三.哈希分布 1.节点取余 2.一致性哈希 添加一个node5节点时,只影响n1和n2之间的数据   3.虚拟槽分区 四.基本架构 五.redis clust ...

  8. [js]nodejs初探http/url/fs模块

    难怪我没学会, 因为我的套路有问题. 错误点, 1,大而全 2,不注重思路 学习要领: 1, 小而精 2, 重思路(总结) nodejs特点: 1.node提供了js的运行环境, 一般将node运行在 ...

  9. Mybatis(二)总结

    1. 输入映射(就是映射文件中可以传入哪些参数类型) 1)基本类型 2)pojo类型 3)Vo类型2. 输出映射(返回的结果集可以有哪些类型) 1)基本类型 2)pojo类型 3)List类型3. 动 ...

  10. 前端JS常见面试题(代码自撸)

    题目一示例: 适用于子数组等长度及不等长度. let arr = [ [1,2,3], [5,6,7,8], [9,10,11,12,13] ] function arrayDiagonal(arr) ...