hihoCoder#1052 基因工程

原题地址

找规律题

如果首尾如果不交,那么不一样的位数就是需要变换的次数。

如果首尾相交,似乎比较复杂,所以找找规律。

假设字符串是这样的(上下是同一个字符串,只是为了方便描述首尾部分而分开画的),要让蓝色的首尾部分相同:

因为是一个字符串,所以虚线部分相同。

即,下图中红色方框部分相同。

因为蓝色首尾部分相同,所以有:

即虚线部分相同:

而此时,我们又可以得到这个虚线部分相同:

最终,不断重复这个过程,我们将蓝色部分划分成了一个个循环节:

从第一步可以看出,这个循环节的长度是n-k

所以,只要保证蓝色部分是以n-k为长度循环即可满足条件。

代码:

 1 #include <iostream>
 2 #include <cstring>
 3
 4 using namespace std;
 5
 6 int main() {
 7   int T, K, N;
 8   char str[1024];
 9
10   cin >> T;
11   while (T--) {
12     cin >> str;
13     cin >> K;
14     N = strlen(str);
15     int res = 0;
16
17     if (K * 2 <= N) {
18       for (int i = 0, j = N - K; j < N; j++, i++)
19         res += str[i] != str[j] ? 1 : 0;
20       cout << res << endl;
21     }
22     else {
23       int len = N - K;
24       for (int i = 0; i < len; i++) {
25         int count[4] = {0};
26         for (int j = i; j < N; j += len) {
27           if (str[j] == ‘A‘)
28             count[0]++;
29           else if (str[j] == ‘T‘)
30             count[1]++;
31           else if (str[j] == ‘C‘)
32             count[2]++;
33           else if (str[j] == ‘G‘)
34             count[3]++;
35         }
36         int maximum = 0;
37         for (int j = 0; j < 4; j++) {
38           maximum = max(maximum, count[j]);
39           res += count[j];
40         }
41         res -= maximum;
42       }
43       cout << res << endl;
44     }
45   }
46
47   return 0;
48 }
时间: 2024-11-09 08:29:38

hihoCoder#1052 基因工程的相关文章

hihoCoder 1052 基因工程 最详细的解题报告

题目来源:基因工程 解题思路:假设基因序列长度为N,则需要计算基因序列前K个和后K个相同所需要的最少改变次数sum. 假设基因序列为 ATACGTCT (即M=8),K=6:interval=M-K=2: 0  1  2  3  4  5  6  7 sq1    A  T  A C  G  T  C  T sq2    A  C G T   C  T 从上图可以看出,标有相同彩色的字符相同,sq1的下标为0的字符与sq2的下标为0的字符相同,即 sq1[0]==sq1[2],由此可以得出sq1

HihoCoder 基因工程

原题链接 http://hihocoder.com/problemset/problem/1052 问题:给定由ATCG组成的长度为N的字符串S,求解最少的改动次数,使得前K个字符序列与后K个字符序列相同,其中 1  <= K <= N 分析: 1)对于长度相同的两个字符串 A 和 B 来说,要将两个字符串变为相同,只需改动所有 Ai != Bi 的地方,令 Ai = Bi 或者 Bi = Ai 即可: 2)当 K <= N / 2 时,前K个字符序列 与 后K个字符序列 没有交集,因此

[hihoCoder#1381]Little Y&#39;s Tree

[hihoCoder#1381]Little Y's Tree 试题描述 小Y有一棵n个节点的树,每条边都有正的边权. 小J有q个询问,每次小J会删掉这个树中的k条边,这棵树被分成k+1个连通块.小J想知道每个连通块中最远点对距离的和. 这里的询问是互相独立的,即每次都是在小Y的原树上进行操作. 输入 第一行一个整数n,接下来n-1行每行三个整数u,v,w,其中第i行表示第i条边边权为wi,连接了ui,vi两点. 接下来一行一个整数q,表示有q组询问. 对于每组询问,第一行一个正整数k,接下来一

hihoCoder 1175:拓扑排序二

题目链接: http://hihocoder.com/problemset/problem/1175 题目难度:一星级(简单题) 今天闲来无事,决定刷一道水题.结果发现这道水题居然把我卡了将近一个钟头. 最后终于调通了.总结起来,原因只有一个:不够仔细. 思路不用细说了,就是拓扑排序的简单应用.然而,一些不起眼的细节才是让你掉坑里的真正原因. 猜猜哪儿可能出bug? // A simple problem, but you can't be too careful with it. #inclu

COGS 1052. [Vijos1022] Victoria的舞会2

1052. [Vijos1022] Victoria的舞会2 并查集吧... #include<bits/stdc++.h> using namespace std; #define maxn 1000000 #define maxm 2333 int n,m,ans,fa[maxn],x,a[maxm][maxm]; int find(int x) { return fa[x]==x?x:fa[x]=find(fa[x]); } int main() { freopen("vict

hihocoder [Offer收割]编程练习赛18 C 最美和弦(dp)

题目链接:http://hihocoder.com/problemset/problem/1532 题解:一道基础的dp,设dp[i][j][k][l]表示处理到第几个数,当前是哪个和弦错了几次初始x值是多少.这里还要再辅助一个val[k]表示处理到当前情况只错了k次的最小值是多少因为改变的不止是和弦还有初始值,可以看一下代码理解一下. #include <iostream> #include <cstring> #include <cstdio> #include &

hihocoder #1190 : 连通性&#183;四 点双联通分量

http://hihocoder.com/problemset/problem/1190?sid=1051696 先抄袭一下 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho从约翰家回到学校时,网络所的老师又找到了小Hi和小Ho. 老师告诉小Hi和小Ho:之前的分组出了点问题,当服务器(上次是连接)发生宕机的时候,在同一组的服务器有可能连接不上,所以他们希望重新进行一次分组.这一次老师希望对连接进行分组,并把一个组内的所有连接关联的服务器也视为这个组内

Hihocoder 太阁最新面经算法竞赛18

Hihocoder 太阁最新面经算法竞赛18 source: https://hihocoder.com/contest/hihointerview27/problems 题目1 : Big Plus 描述 Given an NxN 01 matrix, find the biggest plus (+) consisting of 1s in the matrix. size 1 plus size 2 plus size 3 plus size 4 plus 1 1 1 1 111 1 1

hihoCoder 1393 网络流三&#183;二分图多重匹配(Dinic求二分图最大多重匹配)

#1393 : 网络流三·二分图多重匹配 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 学校的秋季运动会即将开始,为了决定参赛人员,各个班又开始忙碌起来. 小Hi和小Ho作为班上的班干部,统计分配比赛选手的重任也自然交到了他们手上. 已知小Hi和小Ho所在的班级一共有N名学生(包含小Hi和小Ho),编号依次为1..N. 运动会一共有M项不同的比赛,编号为1..M.第i项比赛每个班需要派出m[i]名选手参加. 根据小Hi和小Ho的统计,编号为i的学生表示最多同时参加