hihocoder #1052 基因工程
$\DeclareMathOperator{\rev}{rev}$
传送门:基因工程
这道题拖了好久,一直没有清晰的思路。
当然,$k\le\frac{n}{2}$ 时,比较简单。下面我着重讲一下当 $k>\frac{n}{2}$ ,即前 $k$ 个字符与后 $k$ 个字符有重叠时,如何思考这个问题。
为了便于分析,我们把题目要求形式化成如下的数学表示
假设修改后的字符串为 $S$ ,字符串长度为 $n$ ,则 $S$ 满足
\[S_i = S_{i+n-k} \qquad 1 \le i \le k \]
即“$S$是以$n-k$为周期的字符串”。
这样讲对吗?我们回忆一下数学上周期函数的概念,不难发现这个说法不确切,一个有周期性的字符串是无限长的。
为了消除这种数学上的不严格,我们换一种说法
满足
\[S_i = S_{i+n-k} \qquad 1 \le i \le k\]
且长为$n$的字符串$S$,必定是某个以 $n-k$ 为周期的无限长字符串 $T$ 的子串。
至此我们找到了一个将问题大大简化了的必要条件,显然这个命题反过来也成立。因而有
对于任意长为 $n$ 的字符串 $S$
$S_i = S_{n-k+i} \qquad 1 \le i \le k, \quad 0 \le k \le n,$
$\iff$ $S$ 是某个以 $n-k$ 为周期的无限长字符串 $T$ 的子串
UPDATE (2019/5/16)
另一道跟周期串有关的字符串构造题,CF1158B The minimal unique substring。
$\mathsf{UPD (2018/12/27)}$
多年以后又遇到一个类似的问题,CF1081H Palindromic Magic,想起这篇旧文。
作者(fjzzq2002)在题解中也定义了周期串,把我所谓「$S$ 是某个以 $t$ 为周期的无限长字符串 $T$ 的子串」径称为「$S$ 以 $t$ 为周期($S$ has a period of length $t$)」。
现把题解中的一些术语和定义摘录在此。
问题转化为:求将一个字符串 $S$ 转化为某个以 $n-k$ 为周期的无限长字符串 $T$ 的子串,所需的最少更改次数。
这个问题思考起来可比原问题清楚多了,而且至此我们已经把开头说到的两种情况统一起来了。
可以通过频数统计求解:
分别统计
\[1, 1+n-k, 1+2(n-k), \dots \]
\[2, 2+n-k, \dots\]
\[\cdots\]
\[n-k, n-k+n-k, \dots\]
上A, G, C, T出现的频数,将其改成频数最大的那个字符,这样所需的总改动次数就是答案。
P.S. 这篇随笔是我看了
李舜阳的 hihoCoder #1052 基因工程 后写的。看他画的图还是不能完全把握这个问题,我觉得从数学上将问题形式化,寻找能够简化问题的必要条件,对我们分析问题极有帮助,也是一种科学的思维方式。我们即使不画图也能透彻地分析这个问题,相反只看
李舜阳的图而不借助形式化的推导仍是糊里糊涂。
#include<bits/stdc++.h>
using namespace std;
const int MAX_N=1e3+;
char s[MAX_N];
const char* item="ACGT";
int main(){
//freopen("in", "r", stdin);
int T, K, N, rep, ans, maxi, cnt[]; //A, C, G, T
scanf("%d", &T);
while(T--){
scanf("%s%d", s+, &K);
N=strlen(s+);
rep=N-K;
ans=;
for(int i=; i<=rep; i++){
memset(cnt, , sizeof(cnt));
for(int j=i; j<=N; j+=rep){
for(int k=; k<; k++){
if(s[j]==item[k]){
cnt[k]++;
break;
}
}
}
maxi=;
for(int j=; j<; j++){
maxi=max(maxi, cnt[j]);
ans+=cnt[j];
}
ans-=maxi;
}
printf("%d\n", ans);
}
return ;
}
hihocoder #1052 基因工程的更多相关文章
- hihocoder #1052 : 基因工程(字符串处理 + 找规律 )
#1052 : 基因工程 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho正在进行一项基因工程实验.他们要修改一段长度为N的DNA序列,使得这段DNA上最前面 ...
- hihoCoder 1052 基因工程 最详细的解题报告
题目来源:基因工程 解题思路:假设基因序列长度为N,则需要计算基因序列前K个和后K个相同所需要的最少改变次数sum. 假设基因序列为 ATACGTCT (即M=8),K=6:interval=M-K= ...
- HihoCoder#1052:基因工程
HihoCoder#1052:基因工程 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho正在进行一项基因工程实验.他们要修改一段长度为N的DNA序列,使得这段 ...
- 【HIHOCODER 1052 】基因工程(贪心)
链接 问题描述 小Hi和小Ho正在进行一项基因工程实验.他们要修改一段长度为N的DNA序列,使得这段DNA上最前面的K个碱基组成的序列与最后面的K个碱基组成的序列完全一致. 例如对于序列"A ...
- [HIHO1052]基因工程(找规律)
题目链接:http://hihocoder.com/problemset/problem/1052 题意:中文题面,就是修改其中几个字符,使得[0,k-1]和[n-k,n-1]的字符相同. 会发现一个 ...
- AC日记——地鼠游戏 codevs 1052
1052 地鼠游戏 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 王钢是一名学习成绩优异的学生,在平 ...
- codevs 1052 地鼠游戏
1052 地鼠游戏 http://codevs.cn/problem/1052/ 题目描述 Description 王钢是一名学习成绩优异的学生,在平时的学习中,他总能利用一切时间认真高效地学习,他不 ...
- hihocoder -1121-二分图的判定
hihocoder -1121-二分图的判定 1121 : 二分图一•二分图判定 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 大家好,我是小Hi和小Ho的小伙伴Net ...
- Hihocoder 太阁最新面经算法竞赛18
Hihocoder 太阁最新面经算法竞赛18 source: https://hihocoder.com/contest/hihointerview27/problems 题目1 : Big Plus ...
随机推荐
- WPF Adorner+附加属性 实现控件友好提示
标题太空泛,直接上图 无论是在验证啊,还是提示方面等一些右上角的角标之类的效果,我们会怎么做? 这里介绍一种稍微简单一些的方法,利用附加属性和Adorner来完成. 例如WPF自带的控件上要加这样的效 ...
- ubuntu mysql 更改IP导致mysql无法启动
bind-address = 127.0.0.1 => bind-address= 136.129.20.168 IP要这么改 这么改远程连不上,那么需要把这行整行注释掉,重启MYSQL,tel ...
- iptables规则组成
一.四张表五条链 组成部分:四张表 + 5条链(Hook point) + 规则 四张表:filter nat mangle raw 五条链:PREROUTING INPUT FORWARD OUTP ...
- 转载:ZooKeeper Programmer's Guide(中文翻译)
本文是为想要创建使用ZooKeeper协调服务优势的分布式应用的开发者准备的.本文包含理论信息和实践信息. 本指南的前四节对各种ZooKeeper概念进行较高层次的讨论.这些概念对于理解ZooKeep ...
- CSS 问题集锦
[1]让DIV中的内容居中 1.文字垂直居中,关键代码:height:100px;line-height:100px(两个值要相等) <div style="margin:0 auto ...
- 【转】XSD (xml Schema Definition)
来自:http://www.cnblogs.com/newsouls/archive/2011/10/28/2227765.html Xml Schema的用途 1. 定义一个Xml文档中都有什么元 ...
- my-Life项目开发流程
一:新建java web项目 (懂得使用gradle哦!) 1.http://www.cnblogs.com/xylle/p/5234380.html 2.新建项目后,然后新建module, 如果甲 ...
- [转]Mybatis出现:无效的列类型: 1111 错误
原文地址:http://www.cnblogs.com/sdjnzqr/p/4304874.html 在使用Mybatis时,不同的xml配置文件,有的会提示:无效的列类型: 1111 比如这个sql ...
- 【BZOJ 2154】Crash的数字表格
制杖了,,,求前缀和的时候$i×i$是int,然后当$i=10^7$时就喜闻乐见地爆int了,,,对拍之后查了一个下午的错才发现这个问题,,,最后枚举用的变量全都强行加上long long才A掉 #i ...
- jsrender for object
<div id="result"></div> <script id="theTmpl" type="text/x-js ...