牛オフより学校第五Hのサブシーケンスを2トポロジカル整列

質問の意味:

1000年までのあなたの文字列の長さを与える、この文字列は、10文字までの文字のお二種類、出力文字列にこれらの2つの文字の相対位置を、あなたはもともと何であったか尋ねた文字列ごとにアップしています途中、何も出力されない場合は-1

ソリューション:

セットとして文字列全体は、各文字がトポロジー的にハッセをソートし、このハッセセットを作り、コンテキスト文字列部分順に見コレクション要素として考えられています。;トポロジが0度にポイントしないが、それは1を出力することが発見された場合

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
チャー CH [ 20 ]。
INTの N、M、LEN [ 202 ]、ST [ 202 ]。
チャー SS [ 200 ] [ 20002 ]、ANS [ 20002 ]。
int型の POS [ 20 ] [ 202 ]、CNT [ 20 ]。
ブールチェック(INT U)
{ 
    ためint型 i = 1 ; iがm <; iは++ 
    { 
        int型 ID = POS [U] [I]。
        もし(!ST [ID]> LEN [ID] || SS [ID] [ST [ID]] = U + ' ')を返します
    } を返す
} ボイドワーク(INT U)
{ ためint型 i = 1 ; iがm <; iは++ 
    { int型 ID = POS [U] [I]。
        ST [ID] ++ ; 
    } 
} int型のmain()
{ 
    CIN >> N >> M。
    以下のためにint型 I = 1 ; I <= M *(M- 1)/ 2 
     

    
        
;私は++ 
    { 
        scanf関数(" %sが" )、CHと、
        INT C = CH [ 0 ] - ' A '、D = CHを[ 1 ] - [ A ' 
        POS [C] [ ++ CNT [] C] = I。
        POS [D] [ ++ CNT [D] = I。
        CIN >> lenの[I]、ST [I] = 1 もし(LEN [i])とのscanf(" %sの"、SS [I] + 1 )。
    } 
    のためにint型 I = 1 iが<= N; iが++ 
    {
         int型 T = - 1 INT J = 0 J ++; J <M)の場合は((j)をチェック){T = J。ブレーク;}
         場合(Tの== - 1){プット(" -1 ")。戻り 0 ;} 
        ANSは、[I] = T + ' ' ; 
        (t)が動作します。
    } のためにint型 I = 1 ; I <= M *(M- 1)/ 2、iは++)場合(ST [i]が<= LEN [I]){プット(" -1 ")。
    戻り 0 ;} 
    COUT << ANS + 1 << ENDL。
}

 

おすすめ

転載: www.cnblogs.com/isakovsky/p/11290897.html