ブルージーンズ
http://poj.org/problem?id=3080
制限時間: 1000ミリ秒 | メモリの制限: 65536kも | |
合計提出: 23922 | 受け入れ: 10572 |
説明
ジェノグラフィック・プロジェクトは、地球が移入されたどのようにマッピングするための貢献者の数十万人からのDNAを分析しているIBMとナショナルジオグラフィック協会との研究パートナーシップです。
IBMの研究者として、あなたは新しい遺伝マーカーを同定するために、個々の調査情報と相関させることができるDNAの特定の断片の中で共通点を見つけるプログラムを書い使命を帯びてきました。
DNAの塩基配列は、それらが分子内に見出されている順序で窒素塩基をリストすることによって注目されます。アデニン(A)、チミン(T)、グアニン(G)、シトシン(C):4個の塩基があります。6塩基のDNA配列はTAGACCとして表すことができます。
DNAの塩基配列のセットが与えられると、配列のすべてで起こる塩基の最長系列を決定します。
IBMの研究者として、あなたは新しい遺伝マーカーを同定するために、個々の調査情報と相関させることができるDNAの特定の断片の中で共通点を見つけるプログラムを書い使命を帯びてきました。
DNAの塩基配列は、それらが分子内に見出されている順序で窒素塩基をリストすることによって注目されます。アデニン(A)、チミン(T)、グアニン(G)、シトシン(C):4個の塩基があります。6塩基のDNA配列はTAGACCとして表すことができます。
DNAの塩基配列のセットが与えられると、配列のすべてで起こる塩基の最長系列を決定します。
入力
この問題への入力は、データセットの数を示す単一の整数nを含む行で始まります。各データセットは、次のコンポーネントで構成されています。
- このデータセットの塩基配列の数を示す単一の正の整数m(2 <= M <= 10)。
- m行60個の塩基からなる単一の塩基配列をそれぞれ含みます。
出力
所定の塩基配列のすべてに共通の入力、出力最長のベースサブシーケンス内の各データセットのために。最長共通部分列の長さは以下の3つの拠点である場合は、代わりに「有意な共通点を」文字列を表示します。同じ最長の長さの複数のサブシーケンスは、アルファベット順で最初にくる、出力のみのサブシーケンスを存在する場合。
サンプル入力
3 2 GATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 3 GATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATA GATACTAGATACTAGATACTAGATACTAAAGGAAAGGGAAAAGGGGAAAAAGGGGGAAAA GATACCAGATACCAGATACCAGATACCAAAGGAAAGGGAAAAGGGGAAAAAGGGGGAAAA 3 CATCATCATCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC ACATCATCATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AACATCATCATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
サンプル出力
有意な共通点 AGATAC CATCATCAT
// だけなのでここでは、アルゴリズムの複雑さとの間に少し隙間があったかどうかを見つけることがあるので単純な言葉遣い する#include <stdio.hに> // オンラインギャングコード の#include <アルゴリズム> 書式#include <iostreamの> する#include < ストリング .H> 使用して名前空間STD; のconst int型 MAXN = 65 ; CHAR STR [MAXN]; 文字列ansstr、 文字列STR2 [MAXN]; int型のmain() { int型N-、T; scanfの(" %のD "、&T)。 一方、(T-- ) { scanfの(" %のD "& ; N) のための(int型 I = 0 iがN <; Iは++ ) { scanf関数(" %sの」、STR); STR2 [I] = STR; } int型 ANS = 0 ; 文字列 TMP = STR2 [ 0 ]; INT tmplen = tmp.size(); のため(int型 iは= 0 ; iは<tmplen iは++ ) { ため(int型の J = 1 ; iは+ J <= tmplen; J ++) { のInt CNT = 1。; 文字列 SS tmp.substr =(I、J); //は、文字列を返すが、 //はSのコピーを含むN起動POS文字から(POSのデフォルト値は、N 0、デフォルト値でありますPOS、 -値は()s.sizeある // 全体のデフォルトのパラメータSをコピーせずに、すなわち、) // ; SS TMPは、長さのサブストリングのI jから開始される ため(int型 = K 1、K <N-; ++ K ) { IF(!= STR2 [K] .find(SS) - 。1)//はSSをサブストリングがstr2k文字列を決定し、 CNTは++; // すべての文字列はSSサブストリングであるかどうかを決定するために、いくつかの数を記録します。 } IF(== N-CNT)//は、すべての文字列がサブストリングSSであるか否かを判定する { IF(ANS < J) { ANS = J; ansstr = SS; } そう IF(ANS == J) { ansstr =分(ansstr、SS); // サイズよりも辞書式に大きい; } } } } IF(ANS < 3。 )のprintf("NO \ N-重要な共通点「); 他のprintf(」%S \のN- 」、ansstr.c_str()); // これは、言語Cと互換性があるように、cは、言語の文字列型ではありません 。// それは文字列クラスを渡す必要がありますc_strオブジェクトのメンバー関数()文字列 // スタイルは、Cの文字列にオブジェクト。 // ansstrタイプの文字列を、ansstr.c_str char型へ()変換; } }
#include <cstdioを> する#include <CStringの> する#include <アルゴリズム> の#include <iostreamの> 使用して 名前空間STD。 const int型 MAXN = 65 ; チャーSTR [MAXN]。 文字列ansstr。 文字列STR2 [MAXN]。 INT のmain(){ int型T、N。 scanf関数(" %のD "、&T)。 一方、(t-- ){ scanf関数(" %のD "、&N) 以下のための(int型 I = 0; iがn <; iは++ ){ scanf関数(" %sの" 、STR)。 STR2 [I] = STR。 } int型の CNT = 0 。 以下のために(int型 i = 0 ; iは< 60 ; I ++ ){ ための(int型、J = 1、J + iは<= 60 ; J ++ ){ int型 ANS = 1 。 文字列 SS = STR2 [ 0 ] .SUBSTR(I、J)。 用(int型のk = 1 ; K <Nであり、k ++){ 場合(STR2 [K] .find(SS)=! - 1 ){ ANS ++ 。 } } もし(ANS ==のN){ // のprintf( "%Sの\ n"、ss.c_str())。 もし(CNT < J){ CNT = J。 ansstr = SS。 } そう であれば(CNT == J){ ansstr = 分(ansstr、SS)。 } 他{ 続け; } } 他{ 続けます。 } } } もし(CNT < 3 ){ のprintf(" 有意な共通性は、n \ありません" )。 } 他{ のprintf(" %sのを\ n " 、ansstr.c_str())。 } } 戻り 0 。 }