首页 > 其他分享 >[ARC104B] DNA Sequence 题解

[ARC104B] DNA Sequence 题解

时间:2023-11-02 21:46:59浏览次数:37  
标签:std count ARC104B DNA 题解 sum table 数量 valueType

题意

对于一个只含有 ACTG 的字符串 \(s\), 定义其为匹配的当且仅当其中 A 的数量和 T 的数量相等,C 的数量和 G 的数量相等。

给定一个长度为 \(N\) 的字符串 \(S\),求其有多少个非空子串是匹配的。

\(1 \le N \le 5000\)。

题解

\(\mathcal{O}(N)\) 做法。

首先考虑如果字符集只有 AT 的情况,发现可以维护当前状态下 A 的数量与 T 的数量的差值,发现其值相等的两个端点形成的子串是符合要求的。

那么考虑字符集为 ACTG 的情况,维护维护当前状态下 A 的数量与 T 的数量的差值,以及 C 的数量与 G 的数量的差值即可,将两个数 \(\tt{hash}\) 一下就做完了,使用哈希表存储的话单次修改和查询复杂度均为 \(\mathcal{O}(N)\),总复杂度为 \(\mathcal{O}(N)\)。

Code

#include <bits/stdc++.h>

typedef int valueType;
typedef std::vector<valueType> ValueVector;
typedef std::unordered_map<valueType, valueType> ValueMap;

ValueVector table;

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);

    table.resize(256);
    table['A'] = 6007;
    table['T'] = -(6007);
    table['C'] = 7001;
    table['G'] = -(7001);

    valueType N;

    std::cin >> N;

    ValueMap count;
    valueType ans = 0, sum = 0;

    count.reserve(N);

    count[0] = 1;
    for (valueType i = 1; i <= N; ++i) {
        char c;

        std::cin >> c;

        sum += table[c];

        ans += count[sum];

        ++count[sum];
    }

    std::cout << ans << std::endl;
}

标签:std,count,ARC104B,DNA,题解,sum,table,数量,valueType
From: https://www.cnblogs.com/User-Unauthorized/p/solution-ARC104B.html

相关文章

  • [ARC104D] Multiset Mean 题解
    题意给定\(N,K\)和\(M\)。对于每个大小在\([1,N]\)中的\(x\),求每个元素大小在\([1,N]\)中,平均数为\(x\)且相同元素不超过\(K\)个的可重集的数量,对\(M\)取模。\(1\leN,K\le100\),\(M\)为质数。题解发现对于\(x\),若存在一个合法的集合\(S\),那么有\[\sum\li......
  • [ARC104C] Fair Elevator 题解
    题意有\(N\)个区间\([a_i,b_i](a_i<b_i)\),都是\([1,2n]\)内的整数且互不相同(\(a_i\neb_j,a_i\nea_j,b_i\neb_j\))。现在给定一些\(a\)和\(b\)的值,剩下不知道的用\(-1\)表示。问是否存在一种替换掉\(-1\)的方案,使得:若两个区间有交,那么它们长度相等。即\(\forall......
  • 题解:USACO23OPEN-Silver
    题解:USACO23OPEN-SilverT1MilkSum给定一个长度为\(N\)的序列\(a_1,a_2,...,a_n\),现在给出\(Q\)次操作每次将\(a_x\)修改为\(y\),每次修改后,求将序列重排后的\(T\)的最大值,定义\(T=\sum_{i=1}^{n}i\timesa_i)\)每次修改数组后会将序列还原成原样(修改不继承)有一......
  • CF773A Success Rate 题解
    SuccessRate(提供二分做法)前言听说是史上最简单蓝题,做了一下。题意已知\(x,y,p,q\),通过只让\(y\)加\(1\)或\(x,y\)同时加\(1\),使得满足:\[\frac{x'}{y'}=\frac{p}{q}\]思考目标状态为\(\frac{p}{q}\),考虑到这是个比值,自然\(\frac{x'}{y'}=\frac{kp}{kp}\)。明显......
  • 【POJ 1256】Anagram 题解(全排列)
    描述你要编写一个程序,从一组给定的字母中生成所有可能的单词。示例:给定单词“abc”,您的程序应该-通过探索这三个字母的所有不同组合-输出单词“abc”、“acb”、“bac”、“bca”、“cab”和“cba”。在输入文件中的单词中,某些字母可能出现多次。对于给定的单词,您的程序不应多次......
  • CF1868B2 Candy Party (Hard Version) 题解
    Problem-1868B2-CodeforcesCandyParty(HardVersion)-洛谷相信大家已经看过SimpleVersion,这题和上题不同之处就在于如果\(b_i=2^x\),他可以被分解成\(2^x\)或\(2^{x+1}-2^x\),我们不妨起初固定一种方案,如果不满足条件后再把一部分换回去。我们强制钦定起......
  • CF227A Where do I Turn? 题解
    题目大意:\(A\),\(B\)在一条直线上。\(B\),\(C\)在一条直线上你从\(A\)走到了\(B\)去\(C\),问现在应该是直走、左转、还是右转。思路:分类讨论:分别求\(A\)到\(B\),\(B\)到\(C\)是什么方向,然后可得\(A\)到\(C\)的方向。Code:#include<bits/stdc++.h>usingnamesp......
  • CF333B题解
    分析发现只能跳\(n-1\)次,所以每个点一定是畅通无阻地抵达终点,所以有障碍的行和列放不了,并且每一个行或列最多放一个。因为同时跳,思考会不会跳到一起,发现如果不在正中间可以将起点放到另一头就不会跳到一起,如果在正中间就一定会跳到一起,所以正中间的行和列加一起最多只能放......
  • CF333A题解
    分析被除数一定,除数越小,商越大,所以选择合法的最小\(3_{x}\)。枚举指数即可,复杂度\(\mathcal{O(\log_{3}w)}\),\(w\)为值域\(1e18\),可以通过本题。代码#include<iostream>#defineintlonglongusingnamespacestd;constexprintMAXN(1000007);intf[MAXN];int......
  • P9740 「KDOI-06-J」ION 比赛 题解
    题目思路:先计算总分数\(sum\),\(c_i=\frac{100}{a_i}\)为每道题的每个测试点分数。如果总分数达到\(Au\)线,直接输出AlreadyAu.。否则计算到达\(Au\)线还需多少分\(p\),遍历所有题,求出每道题的失分,如果失分大于等于\(p\),则输出\(\lceil\frac{p}{c_i}\rceil\),即至......