AT_genocon2021_c.Practice 3

入门

通过率:0%

AC君温馨提醒

该题目为【atcoder】题库的题目,您提交的代码将被提交至atcoder进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。

题目描述

给定 mm 个由字母 A、C、G、T 组成的字符串。现在,可以在每个字符串的任意位置插入表示空白的字符 -,使得所有字符串的长度都变为 nn,并将这些长度相同的 mm 个字符串组成 m×nm \times n 的矩阵 SS。SS 的第 ii 行第 jj 列的元素记作 Si,jS_{i,j}(1≤i≤m, 1≤j≤n1 \leq i \leq m,\ 1 \leq j \leq n)。行向量和列向量分别记作 Si,∗S_{i,*}、S∗,jS_{*,j}。现在,希望通过合理地插入 -,使得每一列尽可能多地出现相同的字符。

为衡量每一列“整齐”的程度,对于长度为 mm 的字符串 tt,定义如下分数 CC:

C(t)=min⁡x∈{A,T,G,C,−}∣{t[i] ∣ t[i]≠x (i=1,…,m)}∣C(t) = \min_{x \in \{A, T, G, C, -\}} \left| \{ t[i]\ |\ t[i] \neq x\ (i=1,\ldots,m) \} \right|

通俗地说,C(t)C(t) 表示 tt 中出现次数最多的字符以外的字符的个数。例如,$t = $ CCCC-T 时,C 出现次数最多,C 以外的字符 - 和 T 的总数为 2,所以 C(t)=2C(t) = 2。又如,$t = $ CCAA-T 时,C 和 A 出现次数相同,任选其一作为 xx,C 以外的字符 A、-、T 的总数为 4,所以 C(t)=4C(t) = 4。

对于 SS 的所有列向量,计算 C(S∗,j)C(S_{*,j}),其总和越小,说明输入字符串经过调整后同一列出现相同字符的次数越多。通过在字符串中适当插入 -,使得三条及以上的字符串对齐,这种操作称为多序列比对(Multiple Alignment)。定义所有列的分数总和为 Call(S)=∑j=1nC(S∗,j)C_{all}(S) = \sum_{j=1}^n C(S_{*,j})。

例如,对于 3 个字符串 GGATC, GGAT, GACC,如果按如下方式插入 -:

GGATC
GGAT-
G-ACC

则 Call(S)=C(S∗,1)+C(S∗,2)+C(S∗,3)+C(S∗,4)+C(S∗,5)=0+1+0+1+1=3C_{all}(S) = C(S_{*,1}) + C(S_{*,2}) + C(S_{*,3}) + C(S_{*,4}) + C(S_{*,5}) = 0 + 1 + 0 + 1 + 1 = 3。

给定 mm 个字符串 s1,…,sms_1, \ldots, s_m,请输出一种多序列比对方案,使 Call(S)C_{all}(S) 尽可能小。

输入格式

输入从标准输入读取,格式如下:

mm s1s_1 s2s_2 : sms_m

输出格式

请输出一种多序列比对方案,使 CallC_{all} 尽可能小。按照输入顺序输出每个字符串,在适当位置插入 -,使所有字符串长度相同。每一行的长度必须一致,且每一行去除 - 后应与对应输入字符串完全一致。

输入输出样例

  • 输入#1

    10
    GGAGGTTATTGCTGTGGAGGTACTGGAGAAGGAGGATGCTAGCGTTGGGTAAACCACGAGCATTTTGACTTGTACTTCGCCTC
    GGGTTATTGCTGTTGTGAGTACTGGAGACAGGAGGGAGTGTTAGAGTTGGGGTAAACCACAGTAGCTCATGTCACTTGGATAACTCGTCAGCCTC
    GGTCACTCGCTGTGGAGAGTACTTTGAGACAGGAGGGAGTGCTAGAGTTTGGGGTAAAACCACAGCAGCTCATGCACTTGGATATCTGTGAGCC
    GAGGTTAGTGCTGTGGAGAGTACTGGAGACAGGAGGGAGTGCTAGAGTTGGGGTAAAGCACAGCACCATTCACTGATAAATGTCAGGCCTAGGGG
    GAGGTATTGCTGTGGAGGGTACTGGAGACAGGAGGAGTGCTAGAGGTTGGGGTAAAACCACAGCAGCTCATTTACTTGATACTGTCAGGCTCAGG
    GAGGTTATTTGCTGTGGAGAGTTACTGAGACATGGGGTGCCAAGTTGGGTAGCTACAGCAGCTCATTTCACTTGATACTGCAGGCTCTCAG
    GAGTTAATTTCGTGGAGAGTACTAGAGCACAGGAGGGAGGCCAGATTGGGGTATACCACAGCAGCTCGTTCACTTTAACTGTCAGGCCCTCA
    ACAGTTTAATTGATGGGCGGAGAGTACTGGAGACAGGAGGGAGTGCTAGAGTGGGGTAAACCACAGCAGCATCTTTCATTATAACTGTCAG
    CAAGGTTTTTTCGCTGTGGAGAGTACTGGAGACCGGGGAGTGTAGACTTTGGGGTATCACGTAGCAGCTTATTTCGACTTTGTACTGTAA
    GAGTTATTTCTGTGGAGAGAACTGGAGACGGAGGGAGTGCTAGAGTTGGGGTAAACACCAGGCAGCCATTTCACTTGATAACTGTCAGGCCTT

    输出#1

    GGAGGTTA-TTGCT--GTGGAG-GTAC-TGGAGA-AGGA-GGA-TGCTAGCG-TT-GGGT-AAACCAC-G-AGC-ATTTTGACTT-G-T-ACT--TC-GCCTC----
    --GGGTTA-TTGCT--GTTGTGAGTAC-TGGAGACAGGAGGGAGTGTTAGAG-TTGGGGT-AAACCACAGTAGCTCATGTCACTTGGATAACTCGTCAGCCTC----
    ---GGTCACTCGCT--GTGGAGAGTACTTTGAGACAGGAGGGAGTGCTAGAGTTTGGGGTAAAACCACAGCAGCTCATG-CACTTGGATATCT-GTGAG-C-C----
    -GAGGTTA-GTGCT--GTGGAGAGTAC-TGGAGACAGGAGGGAGTGCTAGAG-TTGGGGT-AAAGCACAGCA-CCATTCACTGATAAATGTCAGGCCTAGGGG----
    --GAGGTA-TTGCT--GTGGAGGGTAC-TGGAGACAGGA-GGAGTGCTAGAGGTTGGGGTAAAACCACAGCAGCTCAT-TTACTT-GAT-ACT-GTCAGGCTC-AGG
    -GAGGTTATTTGCT--GTGGAGAGTTACT-GAGACA--TGGG-GTGCCA-AG-TT-GGGT--AGCTACAGCAGCTCATTTCACTT-GAT-ACT-G-CAGGCTCTCAG
    --GAGTTAATTTC---GTGGAGAGTACTAGAGCACAGGAGGGAG-GCCAGA--TTGGGGT-ATACCACAGCAGCTCGT-TCACTT---TAACT-GTCAGGC-CCTCA
    ACAGTTTAATTGATGGGCGGAGAGTAC-TGGAGACAGGAGGGAGTGCTAGAG--TGGGGT-AAACCACAGCAGCATCTTTCA-TT--ATAACT-GTCAG--------
    CAAGGTT-TTTTCGCTGTGGAGAGTAC-TGGAGAC-CG-GGGAGTG-TAGACTTTGGGGT---ATCAC-GTAG--CAGCTTATTTCG--ACTTTGT-A--CT-GTAA
    --GAGTTA-TTTCT--GTGGAGAGAAC-TGGAGAC-GGAGGGAGTGCTAGAG-TTGGGGT-AAACACCAGGCAGCCATTTCACTT-GATAACT-GTCAGGC-C--TT

说明/提示

约束条件

  • s1,…,sms_1,\ldots,s_m 均为由 A、C、G、T 组成的字符串。
  • small 测试用例:
    • 8≤m≤108 \leq m \leq 10
    • 80≤∣s1∣,…,∣sm∣≤10080 \leq |s_1|,\ldots,|s_m| \leq 100(∣x∣|x| 表示字符串 xx 的长度)
  • large 测试用例:
    • 35≤m≤4035 \leq m \leq 40
    • 700≤∣s1∣,…,∣sm∣≤750700 \leq |s_1|,\ldots,|s_m| \leq 750

计分方式

提交的程序会根据“约束条件”中的 small 和 large 两类测试用例进行评测。small 有 2 个用例,large 有 8 个用例。仅在规定时间内输出格式正确的结果才会被计分。small 用例每个得分为 max⁡{200−⌊Call(S)∗0.2⌋,0}\max\{200 - \lfloor C_{all}(S) * 0.2 \rfloor, 0\},large 用例每个得分为 max⁡{700−⌊Call(S)∗0.1⌋,0}\max\{700 - \lfloor C_{all}(S) * 0.1 \rfloor, 0\}。例如,若仅在规定时间内完成了 2 个 small 用例,则得分为 $ \max{200 - \lfloor C_{all}(S_1) * 0.2 \rfloor, 0} + \max{200 - \lfloor C_{all}(S_2) * 0.2 \rfloor, 0}((S_1, S_2$ 分别为两个用例的输出)。

不能保证最优解能达到满分(4500 或 6000 分)。最终排名将在赛后用另一组数据评测。当前评测系统和赛后评测数据的生成方式相同。

数据生成方式

从参考基因组(人类第 22 号染色体)中截取部分子串 ss,仅包含 A、T、G、C 的区域。对截取的子串模拟测序仪的读取错误(插入、缺失、替换),生成字符串 s′s'。重复多次,组成一个测试用例。测试用例不包含 ss。具体的错误模拟方式不公开,测试数据可从以下链接下载:

问题背景

※ 本节为出题背景,不影响解题,可选阅读。

多序列比对(Multiple Alignment)与成对比对(Pairwise Alignment)一样,在基因组序列分析的多个场景中都有应用。以病毒变异分析为例:

当感染病毒后,体内会产生大量病毒拷贝,同时 DNA 或 RNA 也会被复制。由于复制精度不是 100%,每次复制都会产生各种变异(替换、插入、缺失等),导致产生许多基因组序列略有不同但大致相似的病毒。通过比较这些略有差异但大致相似的序列,分析变异特征,多序列比对就非常有用。

此外,多序列比对还可用于测序仪读取片段的错误纠正。读取基因组时,为了便于后续修正测序错误,会对基因组同一位置进行多次重复读取。得到的片段序列会包含不同的错误,但通过多序列比对并对每一列进行多数投票,可以纠正这些错误。

由 ChatGPT 4.1 翻译

输入解题思路,AI测评打分。不知道怎么写?

首页