3つの文字列を考えると、あなたは3番目の文字列は、最初の二つの文字列の文字を組み合わせることによって形成することができるかどうかを判断します。最初の二つの文字列を任意に混合することができますが、それぞれが元の順序に滞在しなければなりません。
例えば、「猫」と「木」から「tcraete」を形成考える:
文字列A:猫の
文字列B:木の
文字列C:tcraete
あなたが見ることができるように、我々は二つの文字列から文字を交互に3番目の文字列を形成することができます。第2の例として、「猫」と「木」から「catrtee」を形成する検討:
列A:猫の
文字列B:ツリーの
文字列C:catrteeは
最後に、通知は、「猫」と「木から「cttaree」を形成することは不可能であること」。
例えば、「猫」と「木」から「tcraete」を形成考える:
文字列A:猫の
文字列B:木の
文字列C:tcraete
あなたが見ることができるように、我々は二つの文字列から文字を交互に3番目の文字列を形成することができます。第2の例として、「猫」と「木」から「catrtee」を形成する検討:
列A:猫の
文字列B:ツリーの
文字列C:catrteeは
最後に、通知は、「猫」と「木から「cttaree」を形成することは不可能であること」。
入力のInputThe最初の行は、それが従うべきデータセットの数を表す1000を介して1からの単一の正の整数を含んでいます。各データ・セットの処理は同じです。データセットは、次の行に行ごとに1つのデータセットを表示されます。
各データセットについて、入力のラインは、単一のスペースで区切られた3つの文字列からなります。すべての文字列は、大文字と小文字のみで構成されています。3番目の文字列の長さは、常に最初の二つの文字列の長さの和です。最初の2つの文字列が包括的、長さ1〜200文字を持っています。
OutputFor各データセット、印刷:
はい:データは、nを設定する
第三の列は最初の二つから形成することができる場合、または
データがNを設定:いいえ
それができない場合。もちろん、Nはデータセット番号に置き換える必要があります。たとえば、以下のサンプル出力を参照してください。
サンプル入力
3 猫のツリーtcraeteの 猫の木catrteeの 猫の木cttaree
サンプル出力
1つのデータセット:はい データセット2:はい NO:3データセットが
効果被験者が列1及び列2の順序を変更していない場合の組成、列3ことを示唆していない
2次元配列を使用するという考え:: DP [Xを位置] [Y]とマークされた文字列と文字列の位置X 1にアクセスするかどうかを、Y 2
書式#include <iostreamの> の#include < 文字列 > の#include <CStringの> 使用して 名前空間はstdを、 文字列A、B、C; int型フラグ= 0 。 INT DP [ 201 ] [ 201 ]。 ボイド DFS(int型のx、int型のy、int型Z){ 場合(フラグ)のリターン; もし(x == a.size()&& Y == b.size()){ フラグ = 1 。 返します。 } であれば(DP [X] [Y])返します。 DP [X] [Y] = 1 。 もし([X] == C [Z]){ DFS(X + 1、Y、Z + 1 )。 } もし、(B [Y] == C [Z]){ DFS(X、Y + 1、Z + 1 )。 } } int型のmain() { int型のT。 cinを >> トン。 以下のために(int型私= 1 ; I <= T; iは++ ){ CIN >> A >> B >> C。 memsetの(DP、0、sizeof (DP))。 フラグ = 0 。 DFS(0、0、0 ); printf(" データは%dを設定する:" 、i)は、 もし(フラグ) プット(「はい」)。 他のプット(「なし」)。= ""、B = ""、C = "" ; } 戻り 0 。 }