実行時間制限: 10 sec / メモリ制限: 1024 MB
問題文
文字
C(t) = min_{x \in \{A, T, G, C, -\}} \left| \{ t[i] \; | \; t[i] \neq x \; (i=1, \ldots, m) \} \right|
平たく言うと,C(t)はtに含まれる文字の中で最も出現回数の多い文字以外の文字の数となる.例えば,t=
Sのすべての列ベクトルについてC(S_{*,j})を計算し,その総和が少ないほど,同じ列に同じ文字が多く出現するように入力文字列をそろえることができていると言えるであろう.このように,文字列中の適切な場所に空白
例えば,3本の文字列
GGATC GGAT- G-ACC
C_{all}(S) = C(S_{*,1}) + C(S_{*,2})+ C(S_{*,3})+ C(S_{*,4})+ C(S_{*,5}) = 0 + 1 + 0 + 1 + 1 = 3 となる.
m本の文字列 s_{1}, \ldots, s_{m} が与えられたとき,C_{all}(S)をできるだけ小さくするマルチプルアラインメントを出力せよ.
制約
- s_1,...,s_mは
A ,C ,G ,T からなる文字列である. - テストケース(small)の場合
- 8 \leq m \leq 10とする.
- 80 \leq |s_1|, \ldots, |s_m| \leq 100 (文字列xの長さを|x|と記述する.)
- テストケース(large)の場合
- 35 \leq m \leq 40とする.
- 700 \leq |s_1|, \ldots, |s_m| \leq 750
入力
入力は以下の形式で標準入力から与えられる.
m s_{1} s_{2} : s_{m}
出力
入力文字列についてC_{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
配点
提出プログラムは「制約」の項目に記載した2種類のテストケース(smallとlarge)により評価される.smallに該当するケースは2つ,largeに該当するケースは8つ用意されている.制限時間内に正しい記述で出力された結果のみが評価の対象となる. smallの場合は各テストケースにつき,\{200 - \lfloor C_{all}(S) * 0.2 \rfloor \}または0のいずれか大きい方の値が得点に加算される.largeの場合は,\{700 - \lfloor C_{all}(S) * 0.1 \rfloor \}または0のいずれか大きい方の値が得点に加算される.例えば,制限時間内にsmallのケースのみ2つ回答できた場合は, 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番染色体)から部分文字列sを切り出す.ただし,
問題の背景
※ この項目は読まなくても問題を解くことができますが,出題の背景となりますため,ご興味を持ってくださった方はお読みいただけると幸いです.
マルチプルアラインメントは,ペアワイズアラインメントと同様に,ゲノム配列解析の様々な場面において用いられます.ここでは,まず,ウィルスの変異解析について考えてみたいと思います.
ウィルスに感染すると,生体内ではウィルスのコピーがたくさん作られるのですが,その際,設計図となるDNAもしくはRNAも複製されます.しかし,複製の精度は100%ではないため,複製のたびに,新たに作られるウィルスのゲノムには様々な変異(置換,挿入,欠損など)が生じます.そのため,ゲノム配列が少しずつ異なるウィルスがたくさんできてしまうのです.このように少しずつ異なるけれど,大凡は似ている配列を比較して,変異の特徴を分析するのにマルチプルアライメントは役立ちます.
そのほかにも,シークエンサーから読み出された断片配列のエラー訂正にも使われます.DNAからゲノム配列を読み出す際には,シークエンサーのエラーを後で修正できるように,ゲノム上の同じ箇所を重複して読み取ります.こうして得られた断片配列には,読み出した際の状況に応じてエラーが含まれますが,これらの断片配列についてマルチプルアラインメントを作成して,各列について多数決をとれば,エラーを訂正することができます.
Problem statement
Given m strings consisting of
C(t) = min_{x \in \{A, T, G, C, -\}} \left| \{ t[i] \; | \; t[i] \neq x \; (i=1, \ldots, m) \} \right|
C(t) counts the number of characters in t that are not equal to the one that appears in t the most frequently. For example, when t=
If we can generate S such that sum of C(S_{*,j}) for all columns becomes small, it is expected that the given m strings are well aligned. We call such a problem multiple alignment and define the following score.
C_{all}(S) = \sum_{j=1}^n C(S_{*,j})
For example, if we align the three strings
GGATC GGAT- G-ACC
The score C_{all}(S) becomes C(S_{*,1}) + C(S_{*,2})+ C(S_{*,3})+ C(S_{*,4})+ C(S_{*,5}) = 0 + 1 + 0 + 1 + 1 = 3.
Given m strings s_{1}, \ldots, s_{m}, output a multiple alignment such that C_{all}(S) becomes small as much as possible.
Constraints
- s_1,...,s_m are strings consisting of
A ,C ,G ,T . - Test case (small)
- 8 \leq m \leq 10.
- 80 \leq |s_1|, \ldots, |s_m| \leq 100 (the length of x is denoted by|x|.)
- Test case (large)
- $35 \leq m \leq
- 700 \leq |s_1|, \ldots, |s_m| \leq 750
Input
Input is given from Standard Input in the following format:
m s_{1} s_{2} : s_{m}
Output
Print a multiple alignment of input strings such that C_{all} becomes small as much as possible.
After inserting
The judging system can only accept user's output when:
- Each line is equal to the corresponding input line if
Sample Input 1
10 GGAGGTTATTGCTGTGGAGGTACTGGAGAAGGAGGATGCTAGCGTTGGGTAAACCACGAGCATTTTGACTTGTACTTCGCCTC GGGTTATTGCTGTTGTGAGTACTGGAGACAGGAGGGAGTGTTAGAGTTGGGGTAAACCACAGTAGCTCATGTCACTTGGATAACTCGTCAGCCTC GGTCACTCGCTGTGGAGAGTACTTTGAGACAGGAGGGAGTGCTAGAGTTTGGGGTAAAACCACAGCAGCTCATGCACTTGGATATCTGTGAGCC GAGGTTAGTGCTGTGGAGAGTACTGGAGACAGGAGGGAGTGCTAGAGTTGGGGTAAAGCACAGCACCATTCACTGATAAATGTCAGGCCTAGGGG GAGGTATTGCTGTGGAGGGTACTGGAGACAGGAGGAGTGCTAGAGGTTGGGGTAAAACCACAGCAGCTCATTTACTTGATACTGTCAGGCTCAGG GAGGTTATTTGCTGTGGAGAGTTACTGAGACATGGGGTGCCAAGTTGGGTAGCTACAGCAGCTCATTTCACTTGATACTGCAGGCTCTCAG GAGTTAATTTCGTGGAGAGTACTAGAGCACAGGAGGGAGGCCAGATTGGGGTATACCACAGCAGCTCGTTCACTTTAACTGTCAGGCCCTCA ACAGTTTAATTGATGGGCGGAGAGTACTGGAGACAGGAGGGAGTGCTAGAGTGGGGTAAACCACAGCAGCATCTTTCATTATAACTGTCAG CAAGGTTTTTTCGCTGTGGAGAGTACTGGAGACCGGGGAGTGTAGACTTTGGGGTATCACGTAGCAGCTTATTTCGACTTTGTACTGTAA GAGTTATTTCTGTGGAGAGAACTGGAGACGGAGGGAGTGCTAGAGTTGGGGTAAACACCAGGCAGCCATTTCACTTGATAACTGTCAGGCCTT
Sample Output 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
Points
The submitted program is evaluated by two test case types: Small and Large, as denoted in the Constraints section. Small contains two cases, and Large contains eight cases. The points are given to outputs that satisfy the format within the time limit. For each output of a test case in Small, a contestant earns \{200 - \lfloor C_{all}(S) * 0.2 \rfloor \} or 0, whichever is greater. For a test case in Large, the contestant earns \{700 - \lfloor C_{all}(S) * 0.1 \rfloor \} or 0, whichever is greater. For example, if one can generate two outputs S_1 and S_2 for Small-type cases with a correct format within the time limit, one can earn max\{200 - \lfloor C_{all}(S_1) * 0.2 \rfloor, 0\} + max\{200 - \lfloor C_{all}(S_2) * 0.2 \rfloor, 0\}.
We do not guarantee that the optimal solution can achieve the maximum points (6000 points). The final standings are determined by the other dataset generated by the same method used to generate the current test cases.
The method for generating test cases
We extract substring s from chromosome 22 of the human reference genome sequence in the first step. s is extracted such that it does not include