题目描述

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. jquery的设计亮点

    jquery的亮点我目前学习到一下几点: 1.封装库利用window的挂载实现闭包. 库一定要封装来防止变量污染全局,方式要么对象,要么立即执行函数.jquery用了立即执行函数.因为立即执行函数里的 ...

  2. mac下supervisor安装及简单配置

    supervisor是一个用 Python 写的进程管理工具,可以很方便的用来启动.重启.关闭进程(守护进程).可以用他来管理自己的“服务程序”. 安装 首先安装Python,Mac系统好像自带. 执 ...

  3. phjp(ajax)作用知识点

    1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如 ...

  4. 基础SQL注入

    预备知识对mysql数据库有一定了解:对基本的sql语句有所了解:对url编码有了解:空格=‘%20’,单引号=‘%27’,双引号=‘%22’,井号=‘%23’等 基本步骤1. 判断是什么类型注入,有 ...

  5. DELPHI中完成端口(IOCP)的简单分析(2)

    DELPHI中完成端口(IOCP)的简单分析(2)   今天我写一下关于DELPHI编写完成端口(IOCP)的工作者线程中的东西.希望各位能提出批评意见.上次我写了关于常见IOCP的代码,对于IOCP ...

  6. Oracle11g 配置DG broker

    在配置DG broker之前需要确保Dataguard配置正常且主库和备库均使用spfile. 1. 主库配置 配置DG_BROKER_START参数 检查主库dg_broker_start设置 SQ ...

  7. SQL两张表筛选相同数据和不同数据

    原文链接:http://www.cnblogs.com/onesmail/p/6148979.html 方法一: select distinct A.ID from A where A.ID not ...

  8. dex2jar反编译dex文件

    apk实际是一组文件的压缩包,修改为zip或rar后直接解压可以看到其内部内容,其中classes.dex就是java代码编译后的结果 dex2jar可以实现对该文件的反编译 dex2jar镜像地址: ...

  9. 《Java程序设计》 第四周学习总结

    学号 20175313 <Java程序设计>第四周学习总结 教材学习内容总结 第五章主要内容 了解子类的继承性 子类和父类在同一包中的继承性(除private外其余都继承) 子类和父类不在 ...

  10. 【UML】NO.55.EBook.8.UML.3.001-【UML和模式应用 第3版】

    1.0.0 Summary Tittle:[UML]NO.54.EBook.8.UML.3.001-[UML和模式应用 第3版] Style:DesignPattern Series:DesignPa ...