주제 링크 : 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 ; }