POJ 3080暴力

ブルージーンズ
http://poj.org/problem?id=3080
制限時間:  1000ミリ秒   メモリの制限:  65536kも
合計提出: 23922   受け入れ:  10572

説明

ジェノグラフィック・プロジェクトは、地球が移入されたどのようにマッピングするための貢献者の数十万人からのDNAを分析しているIBMとナショナルジオグラフィック協会との研究パートナーシップです。 

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 
}

 

おすすめ

転載: www.cnblogs.com/qqshiacm/p/11587372.html