Codeforces 521A DNA Alignment 规律

题目链接:点击打开链接

题意:

给定长度为n的一个字符串s。

构造长度也为n的字符串t。使得p(s,t)值最大,问有多少个不同的t

h(s,t) = 对应位置上字母相同的个数

ρ("AGC",?"CGT")?=?

h("AGC",?"CGT")?+?h("AGC",?"GTC")?+?h("AGC",?"TCG")?+?

h("GCA",?"CGT")?+?h("GCA",?"GTC")?+?h("GCA",?"TCG")?+?

h("CAG",?"CGT")?+?h("CAG",?"GTC")?+?h("CAG",?"TCG")?=?

1?+?1?+?0?+?0?+?1?+?1?+?1?+?0?+?1?=?6
思路:

首先我们构造t的一个字母,那么这个字母和s的任意一个字母在任意两个位置都会匹配一次,而对应的次数有n次。所以构造的这个字母对答案贡献是 Num[this_Letter] * n

如果t中填一个A,那么p(s,t)的值就增加 (s中A字母个数)*n

所以为了使p最大,则t中能填的字母一定是s中字母数量最多那种。

则s中字母数量最多有多少种,t中每个位置上能填的字母就有多少种。

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int MAX_N = 100007;
const long long mod = 1000000007;

long long Pow(long long x, long long n) {
    long long res = 1;
    while (n > 0) {
        if (n & 1) res = res * x % mod;
        x = x * x % mod;
        n >>= 1;
    }
    return res;
}

char str[MAX_N];
int a[5], n;

int main() {
    scanf("%d%s", &n, str);
    for (int i = 0; str[i]; ++i) {
        if (str[i] == 'A') ++a[0];
        else if (str[i] == 'C') ++a[1];
        else if (str[i] == 'G') ++a[2];
        else ++a[3];
    }
    int up = 0;
    for (int i = 0; i < 4; ++i) up = max(up, a[i]);
    int cnt = 0;
    for (int i = 0; i < 4; ++i) if (a[i] == up) ++cnt;
    long long ans = Pow(cnt, n);
    printf("%I64d\n", ans);
    return 0;
}
时间: 2024-10-11 23:13:44

Codeforces 521A DNA Alignment 规律的相关文章

codeforces 521a//DNA Alignment// Codeforces Round #295(Div. 1)

题意:如题定义的函数,取最大值的数量有多少? 结论只猜对了一半. 首先,如果只有一个元素结果肯定是1.否则.s串中元素数量分别记为a,t,c,g.设另一个串t中数量为a',t',c',g'.那么,固定s串,移动t串时,增加的量为p=a*a'+t*t'+c*c'+g*g'.注意a'+t'+c'+g'是等于串长,那么减少a,t,c,g中最少的对应的那个a',t',c',g',增加到最大的那个上,p值是上升的.而且如果a==t那么a'和t'的数量互换是不影响p值的.因此结论是这种情况下,t串可随意 放

CodeForces 520C DNA Alignment

题意: 一段DNA序列(10^5长度)  定义h函数为两序列相同碱基个数  p函数为分别移动两个DNA序列后所有可能的h函数之和  问使p最大的序列有多少个 思路: 根据p函数的定义  我们发现p这个函数其实就是A序列每个碱基和B序列每个碱基比较再乘一个n 因此可以贪心构造B序列  即每次新加一个碱基必定是A序列中出现次数最多的碱基 那么最后的答案就是A序列中出现次数最多的碱基种类数的n次方 代码: #include<cstdio> #include<iostream> #incl

C. DNA Alignment 数学公式推导 Codeforces Round #295 (Div. 2)

C. DNA Alignment time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Vasya became interested in bioinformatics. He's going to write an article about similar cyclic DNA sequences, so he invente

Codeforces 10C Digital Root 规律题

题目链接:点击打开链接 #include<stdio.h> #include<iostream> #include<string.h> #include<set> #include<vector> #include<map> #include<math.h> #include<string> #include<stdlib.h> #include<algorithm> using nam

Codeforces Round #295 Div1 A(DNA Alignment)

Problem Limits TimeLimit(ms):2000 MemoryLimit(MB):256 n∈[1,105] 字符集∈[A,G,C,T] Look up Original Problem From here Solution 设Ni表示s串中A,G,C,T出现的次数,Mi表示t串中A,G,C,T出现的次数,则max=∑4i=1Ni×Mi,Ni越大,对max的贡献越大,应当分配的Mi越多. answer=an,由推公式得知. 当a=1时,answer=1: 当a=2时,answe

Codeforces #295(Div 2) A Pangram、B Two Buttons、C DNA Alignment

A #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <map> #include <set> #include <vector> using namespace std; int A[50]; int main() { int n; string s; cin>>n; cin>&g

codeforces 630 I(规律&amp;&amp;组合)

I - Parking Lot Time Limit:500MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Description To quickly hire highly skilled specialists one of the new IT City companies made an unprecedented move. Every employee was granted a

Codeforces 480B Long Jumps 规律题

题目链接:点击打开链接 题意: 输出n l x y 有一根直尺长度为l 上面有n个刻度. 下面n个数字是距离开头的长度(保证第一个数字是0,最后一个数字是l) 要使得 直尺中存在某2个刻度的距离为x , 某2个刻度的距离为y 要添加最少几个刻度. 问: 最少的刻度个数 输出标记的位置. 思路: 分类讨论一下.. 若本身尺子里就有x.y就输出0 若只有x 或只有y就输出一个刻度. 若2个都没有就: 1.加1个刻度ans,这个ans是距离某个刻度距离为x的,然后看一下是否有距离ans为y的刻度,若有

#295(div.2) C.DNA Alignment

1.题目描述:点击打开链接 2.解题思路:比赛时没有想到好的思路,后来才发现,只需要t串中的字符是s串中出现次数最多的字符即可,根据乘法原理可知:最终结果是pow(num,n),其中num是s串中次数最多的字符的个数. 3.代码: #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<algorithm> #include<string> #include<sstream> #include&