题解:P10279 [USACO24OPEN] The Winning Gene S

news/2024/11/15 7:08:04/文章来源:https://www.cnblogs.com/gutongxing/p/18369296

思路

建议升蓝。

算法一

考虑暴力。

我们先枚举 \(K,L\),考虑如何求解。

直接枚举每一个 \(K\)-mer,再枚举里面的每一个长度为 \(L\) 的子串,找到最大的子串并在起始部分打一个标记。最后直接看有几个地方被打标记就行。

时间复杂度:\(O(n^4)\)。预计能过测试点 \(1-4\)

算法二

我们可以把选取子串的过程大概画下来。

我们发现每一次都会往后面都会多一个子串,我们可以考虑一个数据结构,可以删除最前面的数据,而且可以往后面加入一个数据,并动态求最值。我在这里选择的数据结构为单调栈

时间复杂度:\(O(n^3)\),预计能过测试点 \(1-7\)

代码

实践后:

常数写大了,超了 0.07秒

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
//#define int long long
namespace gtx{
//	Fast IOvoid read(int &x){x = 0;int h = 1;char tmp;do{tmp=getchar();if(tmp=='-')h*=-1;}while(!isdigit(tmp));while(isdigit(tmp)) x*=10,x+=tmp-'0',tmp=getchar();x*=h;}void read(char &x){do{x=getchar();}while(x==' '||x=='\n'||x=='\r');}void write(char x){putchar(x);}void write(int x){if(x<0) putchar('-'),x=-x;int st[200]={0},tot=0;do{st[++tot]=x%10,x/=10;} while(x);while(tot){putchar(st[tot--]+'0');};}void write(int x,char y){write(x);write(y);}const int MAXN = 3100;int n,ans,t[MAXN];char a[MAXN];signed main(){read(n);for(int i = 1;i<=n;i++) read(a[i]);for(int K = 1;K<=n;K++){for(int L = 1;L<=K;L++){deque<pair<int,string>> st;string now;for(int i = 1;i<=L;i++) now += a[i];st.push_back({1,now});for(int i = 2;i<=K-L+1;i++){now.erase(now.begin());now += a[i+L-1];while(!st.empty()&&st.back().second>now) st.pop_back();st.push_back({i,now});}bitset<MAXN> b;b.set(st.front().first);for(int i = K-L+2;i<=n-L+1;i++){if(st.front().first==i-(K-L)-1) st.pop_front();now.erase(now.begin());now += a[i+L-1];while(!st.empty()&&st.back().second>now) st.pop_back();st.push_back({i,now});b.set(st.front().first);}t[b.count()]++; }}for(int i = 1;i<=n;i++) write(t[i],'\n');return 0;}
}
signed main(){
//	freopen("gene.in","r",stdin);
//	freopen("gene.ans","w",stdout);
//	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int T = 1;
//	gtx::read(T);while(T--) gtx::main();return 0;
}

算法三

我们在上面的代码中发现其实 \(K\) 有没有都几乎没有什么区别,于是可以想一想定长的 \(L\) 可以对哪些答案产生的贡献。

记录前面第一个比这个子串大的子串的起始位置为 \(left_i\),后面第一个比这个子串大的子串的起始位置为 \(right_i\)。那么对于一个子串来说,如果这个子串能产生贡献 \(K\) 最大应该的值的区间应该是这样的:

所以产生的最大的 \(K\)\(right_i+L-2-left_i\)。最小的 \(K\) 应该就是这个子串的长度,那么这个子串就会对这些 \(K\) 产生答案。我们可以用差分解决。

时间复杂度:\(O(n^2)\)。预计得分:\(100pts\)

AC代码

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
//#define int long long
namespace gtx{
//	Fast IOvoid read(int &x){x = 0;int h = 1;char tmp;do{tmp=getchar();if(tmp=='-')h*=-1;}while(!isdigit(tmp));while(isdigit(tmp)) x*=10,x+=tmp-'0',tmp=getchar();x*=h;}void read(char &x){do{x=getchar();}while(x==' '||x=='\n'||x=='\r');}void write(char x){putchar(x);}void write(int x){if(x<0) putchar('-'),x=-x;int st[200]={0},tot=0;do{st[++tot]=x%10,x/=10;} while(x);while(tot){putchar(st[tot--]+'0');};}void write(int x,char y){write(x);write(y);}const int MAXN = 3100;int n,t[MAXN],ans[MAXN][MAXN],left[MAXN],right[MAXN];char a[MAXN];signed main(){read(n);for(int i = 1;i<=n;i++) read(a[i]);for(int L = 1;L<=n;L++){stack<pair<int,string>> st;string now;for(int i = 1;i<=L;i++) now += a[i];st.push({1,now});for(int i = 1;i<=n-L+1;i++) left[i] = 0;for(int i = 1;i<=n-L+1;i++) right[i] = 0;left[1] = 1;for(int i = 2;i<=n-L+1;i++){now.erase(now.begin());now += a[i+L-1];while(!st.empty()&&st.top().second>now) st.pop();left[i] = st.empty()?1:st.top().first+1;st.push({i,now});}while(!st.empty()) st.pop();now="";for(int i = n-L+1;i<=n;i++) now+=a[i];right[n-L+1] = n;st.push({n-L+1,now});for(int i = n-L;i>=1;i--){now.erase(--now.end());now = a[i]+now;while(!st.empty()&&st.top().second>=now) st.pop();right[i] = st.empty()?n:st.top().first+L-2;st.push({i,now});}for(int i = 1;i<=n-L+1;i++){if(right[i]-left[i]+1<L) continue;ans[L][L]++;ans[right[i]-left[i]+2][L]--;}
//				cout << L << endl;
//				for(int i = 1;i<=n;i++) cout << left[i] << " " << right[i] << endl;}for(int j = 1;j<=n;j++){for(int i = j;i<=n;i++){ans[i][j] += ans[i-1][j];t[ans[i][j]]++;}}for(int i = 1;i<=n;i++) write(t[i],'\n');return 0;}
}
signed main(){
//	freopen("gene.in","r",stdin);
//	freopen("gene.out","w",stdout);
//	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int T = 1;
//	gtx::read(T);while(T--) gtx::main();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/784247.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C10-02-HTML示例

HTML:02-1.html 基本功能实现:<a>和<img>标签联合使用及<img src="#"> 图片资源绝对路径引用JS使用:行内式、内嵌式、引入外部JS<input>标签:输入标签文本框<!DOCTYPE html> <html lang="en"> <head><me…

异常与中断的概念以及处理流程

1.CPU理解的中断CPU 在运行的过程中,也会被各种“异常”打断。这些“异常”有:指令未定义 指令、数据访问异常 SWI(软中断) 快中断 中断中断也是 “异常” 的一种,导致中断发生的情况有按键 定时器 ADC转换完成 uart 发送完数据,收到收据 等等 这些众多的“中断源”,汇集到…

wifi基础(一):无线电波与WIFI信号干扰、衰减

liwen01 2024.08.18 前言 无论是在产品开发还是在日常生活中,在使用无线网络的时候,都会经常遇到一些信号不好的问题,也会产生不少疑问:为什么我们在高速移动的高铁上网络会变慢? 为什么 5G WiFi 的穿墙能力没有 2.4G 的好? 为什么在对 WiFi 进行 iperf 拉距测试的时候,…

监理单位项目管理系统:选择前你必须知道的事

国内外主流的 10 款监理单位项目管理系统对比:PingCode、Worktile、Primavera P6、Microsoft Project、Wrike、Asana、Trello、红圈、泛微项目协同工具、广联达。在寻找适合监理单位的项目管理系统时,许多专业人士面临着复杂性和成本效益的双重挑战。一个好的系统不仅需要具备…

多任务进程与线程

多任务进程与线程 一、多任务介绍 ​ 我们生活中有很多事情是同时进行的,比如开车的时候 手和脚共同来驾驶汽车,再比如唱歌跳舞也是同时进行的;用程序来模拟: from time import sleepdef sing():for i in range(3):print("正在唱歌...%d"%i)sleep(1)def dance():…

生产工时管理系统:提高效率的秘诀

国内外主流的10款工时管理平台对比:.Teambition; 2.Tower; 3.蓝凌OA; 4.ClockShark; 5.Hubstaff; 6.TimeClock Plus; 7.Jibble; 8.MISys Labor Tracking;9.PingCode;10.Worktile。在选择合适的工时管理平台时,你是否感到挑战重重?市场上的各种选项似乎都声称能够提…

ArgoWorkflow教程(二)---快速构建流水线:Workflow Template 概念

上一篇我们部署了 ArgoWorkflow,并创建了一个简单的流水线做了个 Demo。本篇主要分析 ArgoWorkflow 中流水线相关的概念,了解概念后才能更好使用 ArgoWorkflow。本文主要分析以下问题:1)如何创建流水线? Workflow 中各参数含义 2)WorkflowTemplate 流水线模版如何使用, …

神经网络之卷积篇:详解单层卷积网络(One layer of a convolutional network)

详解单层卷积网络 如何构建卷积神经网络的卷积层,下面来看个例子。已经写了如何通过两个过滤器卷积处理一个三维图像,并输出两个不同的44矩阵。假设使用第一个过滤器进行卷积,得到第一个44矩阵。使用第二个过滤器进行卷积得到另外一个44矩阵。最终各自形成一个卷积神经网络层…

小小的引用计数,大大的性能考究

本文基于 Netty 4.1.56.Final 版本进行讨论在上篇文章《聊一聊 Netty 数据搬运工 ByteBuf 体系的设计与实现》 中,笔者详细地为大家介绍了 ByteBuf 整个体系的设计,其中笔者觉得 Netty 对于引用计数的设计非常精彩,因此将这部分设计内容专门独立出来。Netty 为 ByteBuf 引入…

【生化代谢基础笔记】RNA 合成

第一节 原核生物转录的模板和酶⚠️ RNA合成需要:DNA Template,NTP,RNA pol,其他蛋白质因子,$Mg^{2+}$一、原核生物转录模板模板链(Template strand) VS 编码链(Coding strand)模板链为合成模板另一股单链为编码链,mRNA 碱基序列与编码链一致二、RNA 聚合酶催化 RNA …

暑假集训CSP提高模拟 25

暑假集训CSP提高模拟 25 组题人: @KafuuChinocpp | @H_Kaguya\(T1\) P235.可持久化线段树 \(0pts\)弱化版: SP11470 TTM - To the moon标记永久化主席树板子。点击查看代码 const ll p=998244353; ll a[100010]; struct PDS_SMT {ll root[100010],rt_sum;struct SegmentTree{…

[Flink] Flink 序列化器

Flink 序列化器依赖包及版本信息org.apache.kafka:kafka-clients:${kafka-clients.version=2.4.1}org.apache.flink:flink-java:${flink.version=1.12.6} org.apache.flink:flink-clients_${scala.version=2.11}:${flink.version} org.apache.flink:flink-streaming-java_${sca…