[USACO]Bovine Genomics
Description
给定两个字符串集合A,B,均包含N个字符串,长度均为M,求一个最短的区间[l,r],使得不存在字符串\(a\in A,b\in B,\)且\(a[l,r]=b[l,r]\) ,字符串只由ACGT组成,
\(n,m\leq500\)
Input Format
第一行包含N,M,
接下来N行,每行一个长度为M的字符串,描述集合A
最后N行,描述集合B
Output Format
一行表示最短区间的长度
Sample Input
3 8
AATCCCAT
ACTTGCAA
GGTCGCAA
ACTCCCAG
ACTCGCAT
ACTTCCAT
Sample Output
4
Solution
emmm,可以用字典树\(O(n^3)\)过,
枚举左端点,对于集合A每个字符串构造字典树,
然后查询集合B中每个字符串,更新答案即可
这里有个优化,即如果集合B中存在一个字符串在字典树中完全存在,直接break跳到下个左端点因为答案一定不存在
Code
#include <cstdio>
#include <algorithm>
#include <cstring>
#define N 550
using namespace std;
int n,m,tr[N*N][5],Ans,cnt;
char s1[N][N],s2[N][N];
inline int opx(const char &c){
switch(c){
case 'A':return 1;break;
case 'C':return 2;break;
case 'G':return 3;break;
default:return 4;break;
}
}
inline void add(const int &id,const int &l){
int now=0;
for(int i=l;i<m;++i){
int k=opx(s1[id][i]);
if(!tr[now][k]) tr[now][k]=++cnt;
now=tr[now][k];
}
}
inline int Find(const int &id,const int &l){
int now=0;
for(int i=l;i<m;++i){
int k=opx(s2[id][i]);
if(!tr[now][k]) return i-l+1;
now=tr[now][k];
}
return -1;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) scanf("%s\n",s1[i]);
for(int i=1;i<=n;++i) scanf("%s\n",s2[i]);
Ans=1e9;
for(int l=0;l<m;++l){
cnt=0;
int mx=0;
memset(tr,0,sizeof(tr));
for(int i=1;i<=n;++i) add(i,l);
for(int i=1;i<=n;++i){
int len=Find(i,l);
if(len==-1){mx=1e9;break;}
mx=max(mx,len);
}
if(mx==1e9) break;
Ans=min(Ans,mx);
}
printf("%d\n",Ans);
return 0;
}
[USACO]Bovine Genomics的更多相关文章
- 洛谷 [USACO17OPEN]Bovine Genomics G奶牛基因组(金) ———— 1道骗人的二分+trie树(其实是差分算法)
题目 :Bovine Genomics G奶牛基因组 传送门: 洛谷P3667 题目描述 Farmer John owns NN cows with spots and NN cows without ...
- 洛谷 P3670 [USACO17OPEN]Bovine Genomics S奶牛基因组(银)
P3670 [USACO17OPEN]Bovine Genomics S奶牛基因组(银) 题目描述 Farmer John owns NN cows with spots and NN cows wi ...
- 【NOIP模拟】【USACO】 Bovine Genomics
Description 给定两个字符串集合A,B,均包含N个字符串,长度均为M,求一个最短的区间[l,r],使得不存在字符串\(a\in A,b\in B,\)且\(a[l,r]=b[l,r]\) , ...
- BZOJ4779: [Usaco2017 Open]Bovine Genomics
题目描述 Farmer John owns Ncows with spots and N cows without spots. Having just completed a course in b ...
- [BZOJ4779] [Usaco2017 Open]Bovine Genomics(hash + 二分)
传送门 网上的题解: 枚举左端点,二分右端点位置,最后所有左端点的答案取最小值 我的题解... 二分答案,枚举左端点,看看是否有解.. 好像和上面是反的,但是思路没问题 过程用hash判重 #incl ...
- USACO比赛题泛刷
随时可能弃坑. 因为不知道最近要刷啥所以就决定刷下usaco. 优先级排在学习新算法和打比赛之后. 仅有一句话题解.难一点的可能有代码. 优先级是Gold>Silver.Platinum刷不动. ...
- 「刷题笔记」哈希,kmp,trie
Bovine Genomics 暴力 str hash+dp 设\(dp[i][j]\)为前\(i\)组匹配到第\(j\)位的方案数,则转移方程 \[dp[i][j+l]+=dp[i-1][j] \] ...
- 「学习笔记」字符串基础:Hash,KMP与Trie
「学习笔记」字符串基础:Hash,KMP与Trie 点击查看目录 目录 「学习笔记」字符串基础:Hash,KMP与Trie Hash 算法 代码 KMP 算法 前置知识:\(\text{Border} ...
- bzoj258 [USACO 2012 Jan Gold] Bovine Alliance【巧妙】
传送门1:http://www.usaco.org/index.php?page=viewproblem2&cpid=111 传送门2:http://www.lydsy.com/JudgeOn ...
随机推荐
- 移植mavlink到stm32详细教程,后面附快速移植方法
一:准备材料: mavlink源码 stm32串口程序 1.mavlink源码: a.进入mavlink官网(http://qgroundcontrol.org/mavlink/s ...
- Js/Jquery获取input file的文件名
html代码: <input type="file" name="file" id="file" class="in ...
- 【Android开发笔记】生命周期研究
启动 onCreate onStart onResume 退出键 onPause onStop onDestroy 锁屏 & 按住 home键 & 被其他Activity覆盖(Sing ...
- nbtscan ip地址
查找网络(192.168.1.0)中netbios名字信息,对应命令如下: nbtscan 192.168.1.1-254 找到有netbios名字后,可以使用如下的命令查看这些主机运行的服务. nb ...
- 触发OOM杀掉了mysql
中午收到反馈平台所有账号全部无法登录,运维就是苦逼,饭都没吃就跑来处理紧急故障,先自己测试了下确实无法登录进系统,登录服务器检查,发现mysql数据库挂掉了,定位到了原因就赶紧重启mysql吧,结果启 ...
- LeetCode Count and Say 数数字
class Solution { public: string countAndSay(int n) { ) "; "; int i,t,count; char c='*'; ;i ...
- HTML5新特性 video '►'
var play = document.createElement('button') play.setAttribute('title','play') play.innerHTML = '►' 创 ...
- UVA Live Archive 4015 Cave (树形dp,分组背包)
和Heroes Of Might And Magic 相似,题目的询问是dp的一个副产物. 距离是不好表示成状态的,但是可以换一个角度想,如果知道了从一个点向子树走k个结点的最短距离, 那么就可以回答 ...
- noip模拟赛#23
T1:n个元素的集合.要求取出k个子集,使得k个子集交集为空集.问有多少中取法. =>推了很久...想的是从k等于2的情况推到k等于3的情况....然后k=2推出来了k=3也推出来了...推了挺 ...
- IBM中国
https://www.ibm.com/developerworks/cn/linux/l-memory/