質問の意味:
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。 }