题目传送门: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] 基因工程 题解的更多相关文章

  1. loj 2778「BalticOI 2018」基因工程

    loj luogu 这题和NOI那道向量内积一个套路 首先考虑求两行的不同元素个数,可以转化成一个行向量\(a\)和列向量\(b\)相乘得到一个值.如果只有\(A,C\)两种字符,那么令对应权值\(A ...

  2. Codeforces:Good Bye 2018(题解)

    Good Bye 2018! 题目链接:https://codeforces.com/contest/1091 A. New Year and the Christmas Ornament 题意: 给 ...

  3. JOI 2018 Final 题解

    题目列表:https://loj.ac/problems/search?keyword=JOI+2018+Final T1 寒冬暖炉 贪心 暴力考虑每相邻两个人之间的间隔,从小到大选取即可 #incl ...

  4. JXOI 2018 简要题解

    目录 「JXOI2018」游戏 题意 题解 代码 「JXOI2018」守卫 题意 题解 代码 「JXOI2018」排序问题 题意 题解 代码 总结 「JXOI2018」游戏 题意 可怜公司有 \(n\ ...

  5. Codeforces Round #505 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) 题解

    真心简单的一场比赛 就是坑比较多(自己太蠢) A是一个水题 3分钟的时候过了 B也是一个比较简单的题 类似的套路见得多了 但是我当时可能比较困 想了一会才想出来 19分钟的时候过掉了 C同样很显然 性 ...

  6. 2019 湖南多校第一场(2018~2019NCPC) 题解

    解题过程 开场shl过B,C,然后lfw写J,J WA了以后shl写A,但是因为OJ上空间开小WA了,而不是MLE?,J加了特判过了.之后一直在检查A错哪了,直到qt发现问题改了空间,浪费许多时间,但 ...

  7. NOIP 2018 简要题解

    从这里开始 Day 1 Problem A 考虑贪心地选取极大非 0 段减少. 如果两次操作有交,并且不是包含关系,那么把其中一次操作的,但另一次没有操作的移过去,然后就变成了上面那个贪心了. Cod ...

  8. 洛谷 P6573 [BalticOI 2017] Toll 题解

    Link 算是回归OI后第一道自己写的题(考CSP的时候可没回归) 写篇题解纪念一下 题目大意: \(n\) 个点,\(m\) 条单向边,每条边的两端点 \(x\),\(y\)必定满足 \(\left ...

  9. codechef February Challenge 2018 简要题解

    比赛链接:https://www.codechef.com/FEB18,题面和提交记录是公开的,这里就不再贴了 Chef And His Characters 模拟题 Chef And The Pat ...

  10. HNOI 2018 简要题解

    寻宝游戏 毒瘤题. 估计考试只会前30pts30pts30pts暴力然后果断走人. 正解是考虑到一个数&1\&1&1和∣0|0∣0都没有变化,&0\&0& ...

随机推荐

  1. Java对象相等判断

    你是谁啊?你是不是我??(⊙_⊙)? 我们知道比较对象相等可以使用equal方法(来自Object对象的方法) 但是你打开Object的equal方法你会发现: public boolean equa ...

  2. rust程序静态编译的两种方法总结

    1. 概述 经过我的探索,总结了两种rust程序静态编译的方法,理论上两种方法都适用于windows.mac os和linux(mac os未验证),实测方法一性能比方法二好,现总结如下,希望能够帮到 ...

  3. LinqHelper拓展

    public static class LinqHelper { //NHibernate.Hql.Ast.HqlBooleanExpression public static Expression& ...

  4. SQL 强化练习 (五)

    果然日常练练这些 sql 是非常有必要的, 这几日的报表开发, 用一款过程软件 fineReport, 相对于我之前用 Tableau 来做报表, 这个帆软, 确实更加适合中国人哦, 而Tableau ...

  5. MQ面试题|Kafka如何实现每秒上百万的高并发写入【转】

        首先,恭喜晚舟归航! 开篇 使用MQ(消息队列)来设计系统带来的好处:业务解耦.流量削峰.灵活扩展.Kafka是高吞吐低延迟的高并发.高性能的消息中间件,在大数据领域有极为广泛的运用.配置良好 ...

  6. required a bean of type 'org.springframework.jms.core.JmsMessagingTemplate' that could not be found

    问题来源:   Spring Boot 项目集成 ActiveMQ. 报错内容:   Description:Field jmsTemplate in XXX required a bean of t ...

  7. Golang操作Json

    基本的序列化 首先我们来看看Go语言中json.Marshal()(序列化)与json.Unmarshal(反序列化)的基本用法. package main import ( "encodi ...

  8. 基于vis.js实现网络拓扑图等关系图谱

    vis.js是一个动态的.基于浏览器的可视化库.该库被设计为易于使用,可以处理大量动态数据,并支持对数据的操作和与数据的交互.该库由组件DataSet, Timeline, Network, Grap ...

  9. electron-vite多窗口案例

    案例使用electron-vite加载2个窗口,每个窗口加载不同的url 配置electron.vite.config.mjs 指向对应的渲染文件,没有就创建 主进程创建窗口时指向预加载文件和要加载的 ...

  10. Mysql规范50条

    支付业务很大程度上依赖于数据库做支持,正确的设置数据库参数以及正确的使用数据库对非常重要,我这把自己之前的一些心得贴出来,抛砖引玉,大家可以把自己的一些心得分享出来供大家参考学习.一.数据库配置1. ...