問題の説明
秘密の扉の中には、非常に興味深いワードパズルが含まれています。考古学者のチームは、扉開閉するためにそれを解決しなければなりません。ドアを開くために他の方法がないので、パズルが私たちのために非常に重要です。
すべてのドア上の磁気プレートが多数あります。すべてのプレートは、その上に書かれた一つの単語を持っています。プレートを前の単語が終了するようにすべての単語が、同じ文字で始まるように配列に配置されなければなりません。例えば、ワード`` ACM「」「はワード`モトローラによって追跡することができます」。あなたの仕事は、単語のリストを読んで、(与えられた規則に従って)の順序でプレートのすべてを手配し、その結果、ドアを開けることが可能であるかどうかを判断するコンピュータプログラムを書くことです。
すべてのドア上の磁気プレートが多数あります。すべてのプレートは、その上に書かれた一つの単語を持っています。プレートを前の単語が終了するようにすべての単語が、同じ文字で始まるように配列に配置されなければなりません。例えば、ワード`` ACM「」「はワード`モトローラによって追跡することができます」。あなたの仕事は、単語のリストを読んで、(与えられた規則に従って)の順序でプレートのすべてを手配し、その結果、ドアを開けることが可能であるかどうかを判断するコンピュータプログラムを書くことです。
入力
入力は、Tテストケースから構成されています。それらの数(T)は、入力ファイルの最初の行に与えられています。各テストケースは、プレート(1 <= N <= 100000)の数を示すNthat単一整数を含む行から始まります。そして、まさにnlines行はそれぞれ1つの単語を含む、従ってください。各ワードは、少なくとも2、最も千の小文字に含まれ、それには、文字「a」〜「z」の言葉に表示されますを意味します。同じ単語がリストに複数回表示されることがあります。
出力
プログラムは、各単語の最初の文字は、前の単語の最後の文字に等しくなるように、配列内のすべてのプレートを配置することが可能であるかどうかを決定しなければなりません。リストからすべてのプレートはそれぞれ一度だけ、使用しなければなりません。何回か言及した言葉は、その回数を使用する必要があります。
プレートの、このような順序が存在する場合は、あなたのプログラムは、「注文が可能です。」の文章を印刷する必要があります。それ以外の場合は、出力文は、「ドアを開くことができません。」。
プレートの、このような順序が存在する場合は、あなたのプログラムは、「注文が可能です。」の文章を印刷する必要があります。それ以外の場合は、出力文は、「ドアを開くことができません。」。
サンプル入力
3
2
DHW
IBM
3
DHW
malform
マウス
2
OK
OK
サンプル出力
ドアを開くことができません。注文が可能です。ドアを開くことができません。
最も重要なことは、それがグラフに接続されているかどうかを判断することです!最後の文字の> B向ける最初の文字 - などの文字列
互いに素セットは、オイラーの定理の度合いかどうかを確認するために、次に出て、連結グラフかどうかを決定すると
#include <ビット/ STDC ++ H.> 使用して名前空間STD; のconst int型= 1E5 + MAXN 5; int型IND [MAXN]; //の各文字を 使用して名前空間STD; int型PAR [MAXN]; //互いに素なセットルートノードは親xは [MAXN] // INT NUMと、 INT VIS [MAXN]; (INITを無効) { (I = 0 int型; IはMAXNを<; I ++の)ため PAR [I] = I、IND [I] 0 =、VIS [I] = 0; //、NUM [I] = I } INT探す(INT X) { IF(!PAR [X] = X) PAR [X] =(PAR [X])を探します。 ; PAR [X]を返す } 連合(int型のX、Y int型)の空隙を { X =検索(X); Yは=検索(Y)を、 IFを{(X = Y!) PAR [Y] = X; // NUM [ Y] NUM [X]を=; } } int型のmain(){ IOS :: sync_with_stdio(偽); int型のトン。 cinを>>トン。 { - (T)一方 、INT nは cinを>> N; IF(N == 1){ 文字列ZZ。 cinを>> ZZ。 プット(「注文が可能です。」); 持続する; } のinit(); {(; iがN <I ++はiが0 = INT)のための 文字列ZZと、 cinを>> ZZ。 INT A = ZZ [0] - 'A'; INT B = ZZ [zz.size() - 1] - [A '; // coutの<< <<」「<< B <<てendl; 連合(a、b)は、 VIS [A] = 1。 VIS [B] = 1。 IND [A] ++; IND [B] - 。 } INT G = 0。 int型CNT1 = 0、CNT0 = 0; G ++; // gが1より大きい通信グラムを示すグラフは、図1の複数の点を示しています! } IF(IND [I] == 1)CNT1 ++; 他IF(IND [I]%2 == - 1)CNT0 ++; 他IF {(IND [I] = 0!) G = 0; BREAK; } } IF (((CNT0 CNT1 == == && 1. 1)||(CNT0 CNT1 == 0 && == 0))== G && 1。。)プット( "可能な発注がされています。"); 他のプット( "ドアを開くことができません" ); } 戻り0; }