POJ 3080 폭력

청바지
http://poj.org/problem?id=3080
시간 제한 :  1000MS   메모리 제한 :  65536k 나
총 제출 : 23922   허용 :  10572

기술

Genographic 프로젝트는 지구가 채워진 방법을지도하는 수백 참여자의 수천에서 DNA를 분석되고 IBM과 국립 지리 학회 (National Geographic Society) 간의 연구 협력이다. 

IBM의 연구원으로, 당신은 새로운 유전 마커를 식별하기 위해 개별 조사 정보와 관련 될 수있는 DNA의 주어진 조각 사이에 공통점을 찾을 수있는 프로그램을 작성하는 임무가 주어왔다. 

이 DNA의 염기 서열은 상기 분자에서 발견 된 순서대로 질소 염기를 나열하여 유의한다. 아데닌 (A), 티민 (T), 구아닌 (G), 시토신 (C) : 네 개의 염기가있다. 6-DNA 염기 서열 TAGACC로 표현 될 수있다. 

DNA 염기 서열의 세트를 가지는, 서열 모두에서 발생하는 염기의 긴 시리즈를 결정한다.

입력

이 문제에 입력 데이터 세트의 개수를 나타내는 하나의 정수 n을 포함하는 선으로 시작할 것이다. 각 데이터 세트는 다음과 같이 구성되어 있습니다 :
  • 이 세트의 염기 서열의 수를 나타내는 하나의 양의 정수 m (2 <= m <= 10).
  • m 라인 60 개 염기로 이루어진 하나의 염기 서열을 포함하는 각.

산출

상기 입력 데이터 세트의 각 출력 소정의 염기 서열을 모두에 공통된 긴베이스 시퀀스를 들어. 가장 긴 일반적인 서브 순서의 길이가 세 개 미만의 기지 인 경우, 문자열 "유의 공통점"대신 표시됩니다. 같은 긴 길이의 다수의 서브 시퀀스는 알파벳 순서로 먼저 출력에만 서브 존재합니다.

샘플 입력

3 
2 
GATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
3 
GATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATA 
GATACTAGATACTAGATACTAGATACTAAAGGAAAGGGAAAAGGGGAAAAAGGGGGAAAA 
GATACCAGATACCAGATACCAGATACCAAAGGAAAGGGAAAAGGGGAAAAAGGGGGAAAA 
3 
CATCATCATCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 
ACATCATCATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AACATCATCATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT

샘플 출력

유의 공통점 
AGATAC 
CATCATCAT
// 단지, 그래서 여기 알고리즘의 복잡성 사이에 약간의 차이가 있었다 여부를 찾을이기 때문에 간단하게 표현 
사용법 #include <stdio.h에> // 온라인 갱스터 코드 
사용법 #include <알고리즘> 
사용법 #include <iostream> 
사용법 #include < 문자열 .H> 은 USING 공간 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 <; 내가 ++ ) 
        { 
            는 scanf ( " %의 S " , STR) 
            STR2 [내가] =의 STR; 
        } 
        INT ANS = 0 ;
         문자열 TMP = STR2의 [를 0 ]
         INT tmplen = tmp.size ()
         에 대해 ( int로 난 = 0 ; i가 <tmplen 난 ++ ) 
        { 
            위해 ( INT의 J = 1 ; i가 + J <= tmplen; J ++) 
            { 
                Int 인 CNT는 = 1. ;
                 문자열 SS는 tmp.substr는 = (I는, J는);   // 문자열을 반환,
                                             //이 시작 POS 문자에서의 n의 사본을 (POS 기본 값이 N의 기본값은 0입니다 포함 값 s.size ()이다 - POS,
                                             // ) 전체 기본 파라미터 S를 복사하지 않고, 즉
                 // SS TMP 길이의 문자열의 난의 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 입력 문자열 유형을 CHAR ansstr.c_str () 변환; 
    } 
}
#INCLUDE <cstdio> 
#INCLUDE <CString을> 
#INCLUDE <알고리즘> 
#INCLUDE <iostream>
 사용  스페이스 성병; 

CONST의  INT의 maxn = 65 ;
STR [maxn];
문자열 ansstr;
스트링 (STR2) [maxn]; 

INT 의 main () {
     INT의 t, N; 
    scanf와 ( " %의 D " , t);
    반면 (t-- ) { 
        는 scanf ( " %의 D ' , N);
         ( INT I = 0; 나는 <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; ++ 케이) {
                     경우 (STR2 [K] .find (SS) =! - 1 ) { 
                        ANS ++ ; 
                    } 
                } 
                경우 (ANS ==의 N) {
                 //     의 printf ( "% S \ 없음"ss.c_str ()); 
                    경우 (CNT < J) { 
                        CNT = J; 
                        ansstr = SS; 
                        
                     } 다른  경우 (CNT == J) { 
                        ansstr = 분 (ansstr, SS); 
                     } 다른 {
                        계속 ; 
                    } 
                    
                 } 다른 {
                       계속 ; 
                 } 
            } 
        } 
        경우 (CNT < 3 ) { 
            의 printf ( " 유의 공통점 N \ 없음 " ); 
        } 다른 { 
            의 printf ( " % S \ 없음 " , ansstr.c_str ()); 
        } 
    } 
    반환  0 ; 
}

 

추천

출처www.cnblogs.com/qqshiacm/p/11587372.html