問題のPOJ3450ソリューション - 暴力orKMP

トピックリンク:http://poj.org/problem?id=3450

コーポレートアイデンティティ

他のサービスのほかに、ACMは明らかに会社のロゴだけでなく、商標などの他の徴候を含んで彼らの「コーポレートアイデンティティを」、状態を企業に役立ちます。そのような企業の一つは、最近、新しいアイデンティティのヘルプのためのACMを求めているインターネットビルマスターズ(IBM)、です。IBMは、顧客が古いものに慣れているので、完全に彼らの既存のロゴや商標を変更する必要はありません。そのため、ACMは唯一の代わりに新しいものを作成する既存の商標を変更します。

いくつかの他の提案した後、それは既存のすべての商標を取得し、それらのすべてに含まれている文字の最長共通の配列を見つけることが決定しました。このシーケンスは、グラフィカルに新しいロゴを形成するために強調されます。新しいアイデンティティを示すながら、昔の商標は、まだ使用することができます。

あなたの仕事は、このようなAのシーケンスを見つけることです。

入力

入力は、いくつかのタスクが含まれています。各タスクは、正の整数N、商標の数(2≤N≤4000)を含む行から始まります。数がそれぞれ1つの商標を含む、N行が続いています。商標は、小文字のみから構成され、各商標の長さは、少なくとも1、最も200文字であろう。

最後商標た後、次のタスクが開始されます。最後のタスクは、ゼロを含む行が続いています。

出力

各タスクに対して、出力は、最長の文字列を含む単一の行はすべての商標でサブストリングとして含まれます。同じ長さの複数の文字列がある場合は、辞書順で最も小さいものを印刷します。代わりに、そのような非空の文字列、出力の言葉「IDENTITY LOST」が存在しない場合。

サンプル入力

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 <ベクトル>
 使用して 名前空間STDを、
#define PIのACOS(-1。
0) の#define PPPP COUT << ENDL。
#define。1E 8-EPSは
 #defineし LLロングロング
 #defineし ULLはunsigned long long型      // 1844674407370955161 
の#define INT_INF 0x3f3f3f3f       // 1061109567 
の#define LL_INF 0x3f3f3f3f3f3f3f3f // 4557430888798830399 
// (falseに)のiOS :: sync_with_stdioを;
 // その後、CIN、ソートされていませんC、scanf関数は、sscanfは一緒に使用し、getchar関数、などのfgetsの。
CONST  INT DR [] {= 00、 - 11、 - 1、 - 111 };
 のconst  int型DC [] = { - 1100、 - 11、 - 11 }。

INT T、ansl、次の[ 210 ]。
ストリング S [ 4010 ]、P、ANS。
int型のmain()
{ 
    IOS :: sync_with_stdio(); 
    cin.tie(0 )。
    一方、(CIN >> T && T)
    { 
        ansl = 0 以下のためにint型私は= 0 ; I <T; I ++)CIN >>S [i]は、
        以下のためにINT iは= 0 ; I <S [ 0 ] .size(); I ++ 
        { 
            int型のL = S [ 0 ] .size() - 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は、MAX = 210 INT J = 1 ; J <T、J ++ 
            { 
                PLEN = 0 ; SLEN = 0 ; SNK = 0 一方、(PLEN <L && SLEN < S [J] .size())
                { 
                    場合(PLEN == - 1 || P [PLEN] == S [J] [SLEN])
                    { 
                        PLEN ++; ++ SLEN 
                    } 
                     PLEN = 次の[PLEN]。
                    もし(PLEN> SNK)
                    { 
                        SNK = PLEN。
                    } 
                } 
                もし(SNK <MAX)最大= SNK。
            } 
            
            であれば(MAX> ansl)
            { 
                ansl = マックス。
                ANS = S [ 0] .SUBSTR(I、MAX)。
                ANS [ansl] = ' \ 0 ' ; 
            } 
            そう であれば(ansl == MAX)
            { 
                文字列TEMP。
                一時 = S [ 0 ] .SUBSTR(iは、MAX);温度[最大] = ' \ 0 ' もし(温度< ANS)
                { 
                    ANS =温度; ANS [ansl] = ' \ 0 ' 
                } 
            } 
        } 
        もし(ansl)COUT << ANS << ENDL。
        裁判所未満<< " IDENTITY LOST " << てendl; 
    } 
    戻り 0 
}
KMP

 

おすすめ

転載: www.cnblogs.com/Mingusu/p/11809864.html