P4795 [BalticOI 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,借鉴于神犇的题解。
这样,有成功地水了一篇题解。
P4795 [BalticOI 2018] 基因工程 题解的更多相关文章
- loj 2778「BalticOI 2018」基因工程
loj luogu 这题和NOI那道向量内积一个套路 首先考虑求两行的不同元素个数,可以转化成一个行向量\(a\)和列向量\(b\)相乘得到一个值.如果只有\(A,C\)两种字符,那么令对应权值\(A ...
- Codeforces:Good Bye 2018(题解)
Good Bye 2018! 题目链接:https://codeforces.com/contest/1091 A. New Year and the Christmas Ornament 题意: 给 ...
- JOI 2018 Final 题解
题目列表:https://loj.ac/problems/search?keyword=JOI+2018+Final T1 寒冬暖炉 贪心 暴力考虑每相邻两个人之间的间隔,从小到大选取即可 #incl ...
- JXOI 2018 简要题解
目录 「JXOI2018」游戏 题意 题解 代码 「JXOI2018」守卫 题意 题解 代码 「JXOI2018」排序问题 题意 题解 代码 总结 「JXOI2018」游戏 题意 可怜公司有 \(n\ ...
- Codeforces Round #505 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) 题解
真心简单的一场比赛 就是坑比较多(自己太蠢) A是一个水题 3分钟的时候过了 B也是一个比较简单的题 类似的套路见得多了 但是我当时可能比较困 想了一会才想出来 19分钟的时候过掉了 C同样很显然 性 ...
- 2019 湖南多校第一场(2018~2019NCPC) 题解
解题过程 开场shl过B,C,然后lfw写J,J WA了以后shl写A,但是因为OJ上空间开小WA了,而不是MLE?,J加了特判过了.之后一直在检查A错哪了,直到qt发现问题改了空间,浪费许多时间,但 ...
- NOIP 2018 简要题解
从这里开始 Day 1 Problem A 考虑贪心地选取极大非 0 段减少. 如果两次操作有交,并且不是包含关系,那么把其中一次操作的,但另一次没有操作的移过去,然后就变成了上面那个贪心了. Cod ...
- 洛谷 P6573 [BalticOI 2017] Toll 题解
Link 算是回归OI后第一道自己写的题(考CSP的时候可没回归) 写篇题解纪念一下 题目大意: \(n\) 个点,\(m\) 条单向边,每条边的两端点 \(x\),\(y\)必定满足 \(\left ...
- codechef February Challenge 2018 简要题解
比赛链接:https://www.codechef.com/FEB18,题面和提交记录是公开的,这里就不再贴了 Chef And His Characters 模拟题 Chef And The Pat ...
- HNOI 2018 简要题解
寻宝游戏 毒瘤题. 估计考试只会前30pts30pts30pts暴力然后果断走人. 正解是考虑到一个数&1\&1&1和∣0|0∣0都没有变化,&0\&0& ...
随机推荐
- 【记录】博客|Markdown写作常用的符号表示、公式写法合集
文章目录 基础内容Basic 1.符号合集 2.LaTeX公式输入 附加内容Addition 1.公式左对齐 2.Markdown文档导出的PDF分页 基础内容Basic 1.符号合集 LATEX M ...
- SQL 日常练习 (十六)
最近接触了一波 RPA, 可以用来做一些数据采集的事情, 或者任意控制电脑上的软件, 感觉上是挺厉害的, 但我就是不想用, 尽管我尝试了一波, 最后还是放弃 了, 我还是喜欢纯代码的工作方式, 最为讨 ...
- Flutter跨平台发送系统通知和状态栏通知技术浅析
@charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...
- 传统的可扩展架构模式:分层架构和SOA
极客时间:<从 0 开始学架构>:传统的可扩展架构模式:分层架构和SOA 分层架构 分层架构是很常见的架构模式,它也叫 N 层架构,通常情况下,N 至少是 2 层.例如,C/S 架构.B/ ...
- WebSocket 与 SSE 对比:即时通信的选择(一)
在现代 Web 开发中,实时通信需求越来越多,比如聊天应用.实时通知.直播弹幕.股票行情推送等.实现这些需求的常见技术有 WebSocket 和 SSE(Server-Sent Events),但它们 ...
- Re:prime 关于质数的算法
Re:prime 关于质数的所有算法 绪言 所有代码若无说明,均采用快读模板 关于质数,无非就两大类: 判断一个数字是不是质数 找出[1,n]中所有的质数 先讲1: Judge 判断x是不是质数 根据 ...
- C++项目提示“error MSB4019: 找不到导入的项目”
报错:C:\Users\DELL\Desktop\PD Manager-20240912(1)\PD Manager\PD Manager\PD Manager.vcxproj(66,5): erro ...
- SolidWorks下载安装教程(附安装包)SolidWorks 2025 软件全方位指南
一.SolidWorks 2025 软件深度介绍 SolidWorks 2025 是达索系统精心研发推出的一款功能强大且专业的三维机械设计软件,它将 3D CAD 设计.分析及产品数据管理功能高度集成 ...
- 【闲话 No.3】 并查集相关
命に嫌われている. 小唐话 感觉有的时候已经无法与人正常交流,净做唐事.说些唐话了.或许是我无法准确猜到别人喜欢什么吧. 不过还是自己心底一点 joker 之心/私心作祟吧. 感觉我有时做的唐事真的挺 ...
- 支持向量机(SVM)分类
支持向量机(Support Vector Machine,SVM)是一种经典的监督学习算法,主要用于分类任务,也可扩展到回归问题(称为支持向量回归,SVR).其核心思想是通过寻找一个最优超平面,最 ...