hiho_1052_基因工程
题目大意
给出一个字符串(长度<=1000),字符串中的字符均为ATCG中的某一个。给出一个数字K,通过更改字符串中的某些字符,可以使得字符串的前K个字符形成的子串和最后K个字符形成的子串相同,求出最少更改的字符个数。
分析
理解题意,画图之后,仿佛是KMP的结果,但是这和KMP没啥关系...画图分析之后,知道问题应该分情况讨论:记 len 为字符串的长度,result为最少更改的字符个数。
(1) len >= 2*K
两个子串中间没有重合,直接进行比较相应位置上的字符,不同result就加1
(2)len - K > K / 2
两个子串中间有重合,但是分析发现,需要加整个字符串分两个部分进行分别统计。t = 2*K-len. [t, K-t), [K-t, 2*(k-t)) 这两个区域应该相同; 且[0, t), [K-t, K), [len - t, len) 这三个区域相同。
(3)len -K <= K / 2
画图可以知道,此时这个len长度的字符串被分成了连续的长度为(len - K)的一段段的子串,这些子串必须相同,最后一个子串可能长度没有(len - K),它就是前面那些子串的前缀。这样就需要判断,将len长度的字符串分割成连续的长度为(len - K)的子串,需要最少改动多少个字符使得这些子串相同。由于每个位置的字符只能为 ATCG中的一个,因此可以维护数组 gcount[len-K][4],其中 gcount[i][c] 表示 那些子串在各自的i位置上的字符为c(将A映射为0,T为1,C为2,G为3)的个数。遍历完一遍母串之后,求出gcount数组,对于每个位置i,都可以求出gcount[i]中的和 sum,以及最大值 max,sum-max即为需要发生的变动,将所有的位置处需要发生的变动加和。
实现
#pragma once
#pragma execution_character_set("utf-8")
// 本文件为utf-8 编码格式 #include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
char gene[1005];
int gcount[1005][4];
int main(){
int T, k;
scanf("%d", &T);
while (T--){
getchar();
scanf("%s", gene);
scanf("%d", &k);
int len = strlen(gene);
int result = 0;
if (len <= k){
result = 0;
}
else if (len >= 2 * k){
for (int i = 0; i < k; i++){
if (gene[i] != gene[i + len - k])
result++;
}
}
else if(len - k > k / 2){
int t = 2 * k - len;
for (int i = t; i < k - t; i++){
if (gene[i] != gene[i + k - t])
result++;
}
for (int i = 0; i < t; i++){
char a = gene[i];
char b = gene[i + k - t];
char c = gene[i + len - t];
if (a == b){
if (a != c)
result++;
}
else if (a == c){
if (a != b)
result++;
}
else if (b == c){
if (b != a)
result++;
}
else
result += 2;
} }
else{
memset(gcount, 0, sizeof(gcount));
for (int i = 0; i < len; i++){
int index = i % (len - k);
if (gene[i] == 'A')
gcount[index][0]++;
else if (gene[i] == 'T')
gcount[index][1] ++;
else if (gene[i] == 'C')
gcount[index][2] ++;
else if (gene[i] == 'G')
gcount[index][3] ++;
}
for (int index = 0; index < (len - k); index++){
int sum = 0, max = 0;
for (int i = 0; i < 4; i++){
sum += gcount[index][i];
max = max > gcount[index][i] ? max : gcount[index][i];
}
result += (sum - max);
}
}
printf("%d\n", result);
}
return 0;
}
hiho_1052_基因工程的更多相关文章
- hihocoder #1052 基因工程
传送门:基因工程 这道题拖了好久,一直没有清晰的思路. 当然,$K\le\frac{N}{2}$时,比较简单.下面我着重讲一下当$K>\frac{N}{2}$,即前$K$个字符与后$K$个字符有 ...
- hihocoder #1052 : 基因工程(字符串处理 + 找规律 )
#1052 : 基因工程 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho正在进行一项基因工程实验.他们要修改一段长度为N的DNA序列,使得这段DNA上最前面 ...
- 【HIHOCODER 1052 】基因工程(贪心)
链接 问题描述 小Hi和小Ho正在进行一项基因工程实验.他们要修改一段长度为N的DNA序列,使得这段DNA上最前面的K个碱基组成的序列与最后面的K个碱基组成的序列完全一致. 例如对于序列"A ...
- HihoCoder1052基因工程(简单模拟题)
描述 小Hi和小Ho正在进行一项基因工程实验.他们要修改一段长度为N的DNA序列,使得这段DNA上最前面的K个碱基组成的序列与最后面的K个碱基组成的序列完全一致. 例如对于序列"ATCGAT ...
- HihoCoder#1052:基因工程
HihoCoder#1052:基因工程 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho正在进行一项基因工程实验.他们要修改一段长度为N的DNA序列,使得这段 ...
- hihoCoder 1052 基因工程 最详细的解题报告
题目来源:基因工程 解题思路:假设基因序列长度为N,则需要计算基因序列前K个和后K个相同所需要的最少改变次数sum. 假设基因序列为 ATACGTCT (即M=8),K=6:interval=M-K= ...
- [HIHO1052]基因工程(找规律)
题目链接:http://hihocoder.com/problemset/problem/1052 题意:中文题面,就是修改其中几个字符,使得[0,k-1]和[n-k,n-1]的字符相同. 会发现一个 ...
- 【xsy1012】KSHKM的基因工程 AC自动机DP
题目大意:给你$n$个串$p_i$,最后再给一个串$s$(字符集均为A,C,G,T四个字符中的一个).问你串$s$最少要更改多少个字符(更改后的字符也只能是ACGT),才能满足s中不包含$p_i$$( ...
- LOJ2778 [BOI2018]基因工程 随机化
题面 不想写了...留坑吧... 基本思想可参照随机化解决判同问题的总结 代码: #include<bits/stdc++.h> using namespace std; #define ...
随机推荐
- C4D to Unity3D插件C2U Tool开源发布!简化你的工作流
Unity早期有对.c4d文件进行支持,但缩放问题,不支持顶点色,以及目标机器必须安装C4D等都极为蛋疼,这是这款工具开发的初衷之一.C2U工具解决了传统FBX导出的诸多问题,以及脚本链接,Shade ...
- 编译器错误消息: CS0016: 未能写入输出文件“c:/Windows/Microsoft.NET/Framework/v2.0.50727/....dll”--“拒绝访问。
错误如下: “/”应用程序中的服务器错误. 编译错误 说明: 在编译向该请求提供服务所需资源的过程中出现错误.请检查下列特定错误详细信息并适当地修改源代码. 编译器错误消息: CS0016: 未能写入 ...
- html的<marquee></marquee>标签实现滚动效果
页面的自动滚动效果,可由javascript来实现,但是今天无意中发现了一个html标签 - <marquee></marquee>可以实现多种滚动效果,无需js控制. 使用m ...
- 2015 AlBaath Collegiate Programming Contest A
Description Tamer is traveling with his brother on a long highway. He sees a traffic light at a dist ...
- 【MySQL】MySQL的Sequence
Oracle的Sequence用爽了,发现MySQL没有Sequence,那么,自己写一个呗. > 最简单的实现 先建一个表存储当前值: CREATE TABLE `t_sequence` ( ...
- STM32 NVIC
在stm32中是要配置nvic的.何为nvic,对于我这样的初学者来说,直观感受就是在设置为中断后 还需要配置 中断的优先级nvic就是搞这个的. 那么具体的需要配置些什么那? void NVIC_C ...
- char、unsigned char、BYTE
首先uchar就是BYTE:Typedef unsigned char BYTE: char:就是signed char,是一个字节,8个位.第8位是符号位,所以可以表示-128~127共256个符号 ...
- MySQL中别名的使用
MySQL中别名的使用 为数据列或者表达式起别名时,别名紧跟数据列,中间以空格隔开,或者用关键字as隔开. #为表达式起别名 使用as关键字隔开 as T_ID from teacher_table; ...
- 异常详细信息: System.Web.Hosting.HostingEnvironmentException: 访问 IIS 元数据库失败 解决方法
访问IIS元数据库失败 同理,给操作系统的新建用户赋予IIS操作权限同样可以采用该命令来处理 说明: 执行当前 Web 请求期间,出现未处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错 ...
- HCE基础知识
HCE基础知识普及 http://www.cebnet.com.cn2014-09-18 10:32来源:中钞研究院 字号: NFC技术发展 NFC(Near Field Communicat ...