首页 > 其他分享 >P4795 [BalticOI 2018] 基因工程 题解

P4795 [BalticOI 2018] 基因工程 题解

时间:2023-08-04 19:55:05浏览次数:36  
标签:opt 字符 P4795 题解 int MaxN 2018 字符串

题目传送门:Click

蒟蒻看见这道题,想了足足一个小时,过后顿有所悟,故作此篇。

首先,看到题目,光是数据就已经达到了 \(\operatorname{O}(nm)\) 的级别,再看一看数据范围:\(3 \leq n,m \leq 4,100\)。显然是一道时间复杂度为 \(\operatorname{O}(n,m)\) 级别的题目。

本蒟蒻首先观察了样例一,统计了每一列每种字符的出现次数:

4 3 1
ACC
CCA
ACA
AAA

第一列有三个 A 和一个 C。第二列有三个 C 与一个 A。第三列有三个 A 与一个 C

接着统计了一下答案即模式串,发现其第一个字符 A 出现 3 次,与其不同的只有一个字符串;第二个字符 C 出现 3 次,与其不同的只有一个字符串;第三个字符 A 出现 4 次,与其不同的只有一个字符串。

将所有与该串不同的字符串个数加起来,发现 \(1+1+1\) 刚好为 \(k \cdot (n-1)\),即每个非模式串与模式串不同的字符数乘上触模式串以外的字符串个数。

于是乎,第一份代码产生了:前往剪贴板

(喜提 \(79 pts\))

为什么错了?(数据这么水,居然有 \(79 pts\)?)

来模拟一下样例二……发现输出 \(1\)!为什么?

稍微想一下,发现因为第 \(2\) 个字符串和第 \(1\) 个字符串有两个字符重复,在统计时,这两个字符会被认为是 \(2,3\) 两串与 \(1\) 相通的部分。总之,就是 \(2\) 号字符串与 \(3\) 号字符串,因为与 \(1\) 号字符串相同的字符贡献都为 \(1\) ,导致无法区分是 \(2\) 号字符串与 \(1\) 号字符串有两个字符相同,还是分别与 \(1\) 号有一个字符相同。

怎么解决?很简单,只要让每个字符串的字符贡献不同,即取一个随机数,就可以区分这些情况。举个栗子,\(2\) 号字符串贡献为 \(1\),\(3\) 号字符串贡献为 \(2\),那么 \(2\) 号字符串的两个字符与 \(1\) 号字符串相同会有 \(2\) 的贡献;而一个字符与 \(2\) 号相同,另一个与 \(3\) 相同,就会有 \(3\) 的贡献。这样,就把几种情况区分开来了。

改进后的代码

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

const int MaxN=4105;
char s[MaxN][MaxN];
mt19937 rnd(998244353);
int n,m,k,opt[128];
typedef long long ll;
ll cnt[MaxN][4],w[MaxN],sum;

int main() {
	opt['A']=0,opt['G']=1,opt['T']=2,opt['C']=3;
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=n;i++) {
		scanf("%s",s[i]+1),w[i]=rnd();
		for(int j=1;j<=m;j++) cnt[j][opt[s[i][j]]]+=w[i];
		sum+=w[i];
	}
	for(int i=1;i<=n;i++) {
		ll res=0;
		for(int j=1;j<=m;j++)
			for(int k=0;k<4;k++) {
				if(opt[s[i][j]]==k) continue;
				res+=cnt[j][k];
			}
		if(res==(sum-w[i])*k) {
			printf("%d\n",i);
			return 0;
		}
	}
	return 0;
}

这里使用了 C++11 里的随机数 mt19937,借鉴于神犇的题解

这样,有成功地水了一篇题解。

标签:opt,字符,P4795,题解,int,MaxN,2018,字符串
From: https://www.cnblogs.com/TimelessWelkinBlog/p/17606860.html

相关文章

  • 暑期竞赛培训 Day 16 <继续写题解>
    -[1][蓝桥杯2013省A]剪格子洛谷P8601题目描述如图\(1\)所示,\(3\times3\)的格子中填写了一些整数。我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是\(60\)。本题的要求就是请你编程判定:对给定的\(m\timesn\)的格子中的整数,是否可以分割为两个部分,使......
  • P4169 题解
    题意二维平面上有\(n\)个点,给你\(m\)次操作,每次操作可以插入一个点或者询问所有点中距离给定点最近的哈密顿距离。\(n,m\le3\times10^5.\)分析这是一道K-DTree的裸题。而对于这道题,我们还需要考虑插入操作。我们给出两种方式:按很多题解的思路,在这棵树上直接按普通......
  • AT_ttpc2015_g 题解
    洛谷的RMJ总是UKE,所以这一题是在ATcoder上做的,记录一,记录二。思路一首先字符串长度一定是\(6\)的倍数,然后判断是否只有\(t\)、\(i\)、\(e\)、\(c\)、\(h\)这五个字符,最后统计一下字符个数就行了。代码(错误):#include<iostream>#include<string>usingnamespacestd;......
  • UVA333 题解
    ##大意:给定一个字符串$s$判断$s$是否符合要求。1.由数字,`-`和大写英文数字`X`,空格组成,`X`代表$10$且只能在最后出现。2.依次相加前面的数字的总和可以被$11$整除,也就是前缀和,而且刚好$s$只有$10$个数字。---##坑点:1.`\r`换行与空格。你写完代码在洛谷......
  • Python爬虫遇到重定向问题解决办法汇总
    在进行Python爬虫任务时,遇到重定向问题是常见的问题之一。重定向是指在发送请求时,服务器会返回一个新的URL,将请求重新定向到该URL。为了帮助您解决这个问题,本文将提供一些实用的解决办法,并给出相关的代码示例,希望能对您的爬虫任务有所帮助。了解重定向问题重定向问题通常是由于网......
  • T1的题解
    一道小清新的思维题!和\(bocchi\)酱一样可爱的喵30pts首先典中典套路:破环成链,数组复制一份。设\(to[i]=\max(\mathbbj)(j\geqi\wedge\sum_{i\leql\leqj}a_l\leqk)\)枚举起始下标,容易想到贪心,考虑前\(i\)个已经确定好怎样分段了,下一个段一定是\([i,to[i]]......
  • P4826 [USACO15FEB] Superbull S题解
    SuperbullS题解题目传送门(可点击)题面题目描述\(Bessie\)和她的朋友们正在一年一度的\(Superbull\)锦标赛中打球,而\(Farmer\)\(John\)负责让比赛尽可能激动人心。总共有N支队伍(\(1\leN\le2000\))参加了\(Superbull\)锦标赛。每个团队都有一个\(1...2^{30}−1\)的团队ID......
  • java 同一个对象之间赋值后添加入List中,属性值相互覆盖的问题解决方案
    1、for循环中NEW对象,因为List中存的是对象的引用地址。2、BeanUtils是属于spring框架下beans包下的工具类BeanUtils它提供了对java反射和自省API的包装。它里面还有很多工具类,这篇文章我们介绍一下copyProperties这个方法使用情景一般当我们有两个具有很多相同属性的JavaBean......
  • RTSP流媒体服务器LntonNVR(源码版)平台前端打包出现“UglifyJsPlugin”报错的问题解决
    LntonNVR既有软件版也有硬件版,平台基于RTSP/Onvif协议将前端设备接入,可实现的视频能力有视频监控直播、录像、视频转码分发、检索与回放、云存储、智能告警、国标级联等。平台可将接入的视频流进行转码分发,对外输出的视频流格式包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等。......
  • 国标GB28181平台LntonGBS(源码版)国标视频平台在连接MySQL数据库时提示“can’t connect
    LntonGBS国标视频云服务平台不仅支持无缝、完整接入内网或者公网的国标设备,还能够实现全平台、全终端输出。该平台支持将GB/T28181的设备/平台推送的PS流转成ES流,并提供RTSP、RTMP、FLV、HLS、WebRTC等多种格式视频流的分发服务,实现Web浏览器、手机浏览器、微信端、PC客户端等各终......