문제에 POJ3450 솔루션 - 폭력 orKMP

주제 링크 : http://poj.org/problem?id=3450

기업의 정체성

다른 서비스 옆에, ACM 명확 상표와 같은 회사 로고뿐만 아니라 다른 증상을 포함 그들의 "기업의 정체성을"상태로 기업을하는 데 도움이됩니다. 그런 회사 중 하나는 최근에 새로운 정체성과 도움을 ACM을 요청했다 인터넷 건축 석사 (IBM)입니다. IBM은 고객이 기존의 것들에 사용되기 때문에, 완전히 기존의 로고 및 상표를 변경하지 않습니다. 따라서, ACM은 대신 새로 만드는 기존의 상표를 변경합니다.

여러 가지 다른 제안 후, 기존의 모든 상표를 가지고 그들 모두에 포함되는 문자의 긴 일반적인 순서를 찾기로 결정했다. 이 시퀀스는 그래픽으로 새로운 로고를 형성하기 위해 강조 될 것이다. 새로운 정체성을 보여 주면서 그런 다음, 오래된 상표는 여전히 사용할 수 있습니다.

당신의 작업은 이러한 순서를 찾는 것입니다.

입력

입력은 여러 가지 작업이 포함되어 있습니다. 각 작업은 양의 정수 N, 상표의 수 (2 ≤ N ≤ 4000)를 포함하는 라인으로 시작한다. 숫자는 각각의 하나를 포함하는 상표, N 라인 따른다. 상표는 소문자로 구성되며, 각 상표의 길이는 적어도 1 대부분의 200 자에있을 것입니다.

지난 상표 후, 다음 작업이 시작됩니다. 마지막 작업은 제로를 포함하는 라인으로 이어진다.

산출

각 작업의 경우, 출력은 긴 문자열이 포함 된 한 줄의 모든 상표에 문자열로 포함되어 있습니다. 같은 길이의 여러 문자열이있는 경우, 전적으로 가장 작은 사람을 인쇄 할 수 있습니다. 대신 그러한 비어 있지 않은 문자열 출력 단어 "IDENTITY 손실"이없는 경우.

샘플 입력

3 
aabbaabb 
abbababb 
bbbbbabb 
2 
XYZ 
ABC 
0

샘플 출력

ABB 
IDENTITY LOST
#INCLUDE <알고리즘> 
#INCLUDE <cstdio> 
#INCLUDE <CString을> 
#INCLUDE <cmath> 
#INCLUDE <cstdlib> 
#INCLUDE <iostream> 
#INCLUDE <iomanip> 
#INCLUDE <일람> 
#INCLUDE <지도> 
#INCLUDE <큐> 
#INCLUDE <sstream> 
#INCLUDE <적층> 
#INCLUDE < 문자열 > 
#INCLUDE < 세트 > 
#INCLUDE <벡터>
 사용  스페이스 성병;
#DEFINE PI의 ACOS (-1.
0) #DEFINE의 PPPP의 COUT << ENDL;
#밝히다. 1E 8 허가제가
 #define한다 LL 긴 긴
 #define한다 ULL는 긴 머리 긴 부호없는      // 1844674407370955161 
#DEFINE INT_INF 0x3f3f3f3f       // 1061109567 
#DEFINE LL_INF 0x3f3f3f3f3f3f3f3f // 4557430888798830399 
// (false로) 아이폰 OS :: sync_with_stdio을;
 // 다음 CIN, 정렬되지 C, scanf와는 sscanf를 함께 사용, getchar가 같은는 fgets. 
CONST  INT의 DR [] = { 0 , 0 , - 1. , 1. - 1. - 1. , 1. , 1. }
 CONST  INTDC [] = {- 1 , 1 , 0 , 0 , - 1 , 1 - 1 , 1 }; 

INT의 t, ansl 다음 [ 210 ];
문자열 S [ 4010 ], P, ANS;
int로 주 () 
{ 
    IOS를 :: sync_with_stdio ( 거짓을 ); 
    cin.tie ( 0 );
    반면 (CIN >> t && t) 
    { 
        ansl = 0 ;
        위한 ( INT 난 = 0 ; I <t; I ++) CIN >>시];
        위한 ( INT 난 = 0 ; I <S [ 0 ] 크기는 (); I ++ ) 
        { 
            INT의 패 = S [ 0 ] 크기는 () - I; 
            P = S [ 0 ] .substr (I, l); 
            
            다음 [ 0 ] = - 1 ;
            INT slen = - 1 ;
            INT PLEN = 0 ;
            반면 (PLEN < l) 
            { 
                경우 (slen == - 1 || P [PLEN] == P [slen]) 
                {
                    PLEN  ++; slen ++;
                    만약 (! P [PLEN] = P [slen]) 
                    다음 [PLEN] = slen;
                    
                    다음 [PLEN] = 다음 [slen]; 
                } 
                다른 slen = 다음 [slen]; 
            } 
            
            INT의 최대 = SNK, 210 ;
             ( INT J = 1 ; J <t, J ++ ) 
            { 
                PLEN = 0 ; slen = 0 ; SNK = 0 ;
                동안(PLEN <L && slen < 최대; S [J] 크기는 ())
                { 
                    경우 (PLEN == - 1 || P [PLEN] == S [J] [slen]) 
                    { 
                        PLEN ++; slen ++ ; 
                    } 
                    다른 PLEN = 다음 [PLEN];
                    경우 (PLEN> SNK) 
                    { 
                        SNK = PLEN; 
                    } 
                } 
                경우 (SNK <최대) = 최대가 SNK; 
            } 
            
            만약 (최대> ansl) 
            { 
                ansl =
                ANS = S [ 0] .substr (I, 최대); 
                ANS [ansl] = ' \ 0 ' ; 
            } 
            다른  경우 (ansl == 최대) 
            { 
                문자열 온도; 
                임시 = S [ 0 ] .substr (I, 최대) [최대] 온도 = ' \ 0 ' ;
                경우 (온도 < ANS) 
                { 
                    ANS = 온도, ANS [ansl] = ' \ 0 ' ; 
                } 
            } 
        } 
        경우 (ansl) COUT << ANS << ENDL;
        그밖에COUT << " IDENTITY LOST " << ENDL; 
    } 
    반환  0 ; 
}
KMP

 

추천

출처www.cnblogs.com/Mingusu/p/11809864.html