首页 > 其他分享 >[USACO24OPEN] The 'Winning' Gene S

[USACO24OPEN] The 'Winning' Gene S

时间:2024-05-01 15:44:24浏览次数:11  
标签:子串 候选 cnt le int Winning USACO24OPEN mer Gene

[USACO24OPEN] The 'Winning' Gene S

题目背景

注意:本题的内存限制为 512MB,通常限制的 2 倍。

题目描述

在多年举办比赛并看着 Bessie 一次又一次地获得第一名后,Farmer John 意识到这绝非偶然。他得出结论,Bessie 一定将胜利写进了 DNA,于是他开始寻找这种「胜利」基因。

他设计了一个过程来识别这个「胜利」基因的可能候选。他获取了 Bessie 的基因组,为一个长为 \(N\) 的字符串 \(S\),其中 \(1\le N\le 3000\)。他选择某个数对 \((K,L)\),其中 \(1\le L\le K\le N\),表示「胜利」基因候选的长度将为 \(L\),并且将在一个较大的 \(K\) 长度子串中进行寻找。为了识别这一基因,他从 \(S\) 中取出所有 \(K\) 长度的子串,我们将称这样的子串为一个 \(K\)-mer。对于一个给定的 \(K\)-mer,他取出其所有长度为 \(L\) 的子串,将字典序最小的子串识别为胜利基因候选(如果存在并列则选择其中最左边的子串),然后将该字串在 \(S\) 中的起始位置 \(p_i\)(从 \(0\) 开始索引)写入一个集合 \(P\)。

由于他还没有选定 \(K\) 和 \(L\),他想知道每对 \((K,L)\) 将有多少个候选。

对于 \(1\ldots N\) 中的每一个 \(v\),帮助他求出满足 \(|P|=v\) 的 \((K,L)\) 对的数量。

输入格式

输入的第一行包含 \(N\),为字符串的长度。第二行包含 \(S\),为给定的字符串。输入保证所有字符均为大写字符,其中 \(s_i\in \texttt A-\texttt Z\),因为奶牛遗传学远比我们的高级。

输出格式

对于 \(1\ldots N\) 中的每一个 \(v\),输出满足 \(|P|=v\) 的 \((K,L)\) 对的数量,每行输出一个数。

样例 #1

样例输入 #1

8
AGTCAACG

样例输出 #1

11
10
5
4
2
2
1
1

提示

样例解释 1

在这个测试用例中,输出的第三行为 \(5\) 是因为我们发现恰好有 \(5\) 对 \(K\) 和 \(L\) 存在三个「胜利」基因候选。这些候选为(其中 \(p_i\) 从 \(0\) 开始索引):

(4,2) -> P = [0,3,4]
(5,3) -> P = [0,3,4]
(6,4) -> P = [0,3,4]
(6,5) -> P = [0,1,3]
(6,6) -> P = [0,1,2]

为了了解 \((4,2)\) 如何得到这些结果,我们取出所有的 \(4\)-mer

AGTC
GTCA
TCAA
CAAC
AACG

对于每一个 \(4\)-mer,我们识别出字典序最小的长度为 \(2\) 的子串

AGTC -> AG
GTCA -> CA
TCAA -> AA
CAAC -> AA
AACG -> AA

我们取出所有这些子串在原字符串中的位置并将它们添加到集合 \(P\) 中,得到 \(P=[0,3,4]\)。

另一方面,如果我们关注 \((4,1)\) 对,我们会发现这只会得到总共 \(2\) 个「胜利」基因候选。如果我们取出所有的 \(4\)-mer 并识别字典序最小的长度为 \(1\) 的子串(用 A,A' 和 A* 来区分不同的 A),我们得到

AGTC -> A
GTCA' -> A'
TCA'A* -> A'
CA'A*C -> A'
A'A*CG -> A'

尽管 A' 和 A* 在最后 3 种情况下字典序均为最小,但最左边的子串优先,因此仅有 A' 在所有这些情况中被视为候选。这意味着 \(P=[0,4]\)。

测试点性质

  • 测试点 \(2-4\):\(N\le 100\)。
  • 测试点 \(5-7\):\(N\le 500\)。
  • 测试点 \(8-16\):没有额外限制。

赛时代码(66)

#include <bits/stdc++.h>
using namespace std;

const int N = 3005;
int n, p[N], cnt[N];
char s[N];

int pl[N][N], qwq[N][N], ll;
bool check(int a, int b){
	if(pl[a][ll-1] != pl[b][ll-1])
		return pl[a][ll-1]<pl[b][ll-1];
	if(s[a+ll-1] != s[b+ll-1])
		return s[a+ll-1] < s[b+ll-1];
	return a < b;
}

int find(int l, int L, int R){
	if(R-L+1 < l) return 0;
	int minp = L, ret = 1;
	for(int i = L+1; i+l-1 <= R; i++)
		if(pl[i][l] < pl[minp][l]) minp = i;
	ret += find(l, L, minp+l-2);
	ret += find(l, minp+1, R);
	cnt[R-L+1]++; return ret;
}

int main(){
	scanf("%d%s", &n, s+1);
	for(ll = 1; ll <= n; ll++){
		for(int i = 1; i+ll-1 <= n; i++)
			qwq[ll][i] = i;
		sort(qwq[ll]+1, qwq[ll]+n-ll+2, check);
		for(int i = 1, cnt = 0; i+ll-1 <= n; i++){
			if(pl[qwq[ll][i]][ll-1] != pl[qwq[ll][i-1]][ll-1]
			 || s[qwq[ll][i]+ll-1] != s[qwq[ll][i-1]+ll-1])
				cnt++;
			pl[qwq[ll][i]][ll] = cnt;
		}
	}
	for(int l = 1; l <= n; l++){
		find(l, 1, n);
		for(int i = n; i >= l; i--){
			cnt[i] += cnt[i+1];
			cnt[i+1] = 0; p[cnt[i]]++;
		} cnt[l] = 0;
	}
	for(int i = 1; i <= n; i++)
		printf("%d\n", p[i]);
	return 0;
}

标签:子串,候选,cnt,le,int,Winning,USACO24OPEN,mer,Gene
From: https://www.cnblogs.com/meteor2008/p/18160960

相关文章

  • dbt docs generate 简单说明
    dbtdocsgenerate核心是获取dbt项目的元数据信息(包含了project的)以及相关table的(dbt模型相关的),然后通过提供的解析页面进行显示目前是基于静态处理的(先生成,然后基于纯web的解析渲染)对于展示方法很多,可以基于dbt的docsserve命令也可以基于自己的静态webserver(nginx或......
  • Qt QSettings读写ini时 General 读不出来值
    简述我有一个配置文件,其中一个组General,怎么都读不出正确的值,全是空,但是别的组能读出来,改General2试试,果然可以,就怀疑是不是组名称被内置了。打开QSettings的帮助文档,搜索General,有内容,看下解释TheINIfileformathassevererestrictionsonthesyntaxofakey.Qt......
  • go generate ./... 含义
     gogenerate./...是一个Go语言中的命令,用于在编译前自动执行代码生成任务。这个命令会遍历当前包及其子包中的所有源代码文件,查找所有包含特殊注释//go:generate的行。这些注释后面跟着的是应该执行的命令,用于生成额外的源代码、元数据或其他编译时所需的文件。执行g......
  • Express - 使用express-generator创建应用
    安装express-generatorpnpmadd-gexpress-generator查看express-generator查看版本express--version查看帮助express-h创建express应用express-vejs-cless--gitexpress-app选项-v设置模版引擎(dust|ejs|hbs|hjs|jade|pug|twig|vash),默认为jade选......
  • 为 IIncrementalGenerator 增量 Source Generator 源代码生成项目添加单元测试
    本文属于IIncrementalGenerator增量SourceGenerator源代码生成入门系列博客,本文将和大家介绍如何为源代码生成项目添加单元测试添加单元测试的作用不仅可以用来实现通用的单元测试提高质量的功能,还能用来辅助调试IIncrementalGenerator增量SourceGenerator源代码生成项......
  • 使用 ForAttributeWithMetadataName 提高 IIncrementalGenerator 增量 Source Generat
    本文将告诉大家如何使用ForAttributeWithMetadataName方法用来提高IIncrementalGenerator增量SourceGenerator源代码生成的开发效率以及提高源代码生成器的运行效率这是一个在2022的6月15才合入的新功能。原因是Roslyn团队发现了大量的源代码生成器和分析器项目都......
  • 安装软件提示 Runtime Error (at 28:321): Generic faiure Swbemlocator
    第一次遇见这个问题,查了下,根据ai智能提示总结下。报错解释:这个错误通常表示在Windows操作系统中,在安装或运行软件时,与WindowsManagementInstrumentation(WMI)服务交互时出现问题。SwbemLocator是一个COM对象,用于连接到WMI服务,进行系统管理任务。"Genericfailure"意味着操作......
  • DeiT:训练ImageNet仅用4卡不到3天的平民ViT | ICML 2021
    论文基于改进训练配置以及一种新颖的蒸馏方式,提出了仅用ImageNet就能训练出来的Transformer网络DeiT。在蒸馏学习时,DeiT以卷积网络作为teacher,能够结合当前主流的数据增强和训练策略来进一步提高性能。从实验结果来看,效果很不错来源:晓飞的算法工程笔记公众号论文:Trainingd......
  • @Degenerate_Sheep
    因为神秘原因翻到了之前的一个......
  • .NET Emit 入门教程:第六部分:IL 指令:8:详解 ILGenerator 指令方法:类型转换指令
    前言:经过前面几篇的学习,我们了解到指令的大概分类,如:参数加载指令,该加载指令以 Ld开头,将参数加载到栈中,以便于后续执行操作命令。参数存储指令,其指令以St开头,将栈中的数据,存储到指定的变量中,以方便后续使用。创建实例指令,其指令以New开头,用于在运行时动态生成并初始化对......