ポータルのタイトル(タイトル56の内側)
入力形式
$ Tの$データセットの数を表す:最初の行は、整数を含んでいます。
そして、$ T $の行がそれぞれ2つの文字列を含んでなる:$ \ bは$。
出力フォーマット
各試験のために、もし$ C $、辞書$ C $最大出力最長の、又は-1出力$ $の存在下。
サンプル
サンプル入力:
3
AB BA
ABAバブ
ABが開始しました
出力例:
-1
AB
AB
データ範囲とヒント
サンプルは説明しました:
こうした$ C $が存在しないなど、データの最初のセット、のために。
$ $ BABごとに第2の操作によって$ ABA $、$ AB $への最初の操作でデータの第2群、$ AB $ため。
第3のデータセットのために、$ ABは$ AB $を得ることができない操作者は、$ AB $の第二動作が$ ABAA $、$を得るために2回実施されていないとABが辞書最長最小満足の長さです。$ $ $ C $の条件。
データ範囲:
| | $ 10 \%の$データ、$ 1 \ leqslantための <| | B \ leqslant 6 $、
$ 30 \%の$データについて、$ 1 \ leqslant | | <| B | \ leqslant 12 $、
$ \ 100%をデータ$、$ 1 \ leqslant | | <| B | \ leqslant 2,000,1 \ leqslant T \は20 $をleqslant、 $、B $を保証$、B $の文字からです。
問題の解決策
難易度のこの質問は、辞書編集問題を聞かせてどのようにあります。
実際には、我々は二つの点から見ることができ、辞書式の問題を検討する必要はありません。
$ \アルファ。$タイトルとサンプル解釈は辞書順最小のですが、出力形式はコーチ、辞書的に最大に書かれていたし、タイトルを変更しなかったので、この質問辞書式問題を考慮していないと言います。
プロセスについての$ \ベータ版。$シミュレーション、唯一の上の1つの方法の文字列から転送することができますので、我々は振り返ることができ、長さのために、私たちは文字列のみを振り返ることができますので、私たちは辞書式の問題を考慮していません。
この問題は大きなシミュレーションで解決するために、実際には、あなたは線形時間複雑性を達成するための$ $のハッシュを使用しますが、明らかにチェンによって書かれた疑問符の外にも怠惰を盗むことができます。
時間の複雑さ:$ \シータ(N ^ 2)$。
期待はスコア:$ $ 100ポイントを。
実際のスコア:$ $ 100ポイント。
コードの時間
#include<bits/stdc++.h>
using namespace std;
char ch1[2001],ch2[2001];
int a[2001],b[2001];
bool judge(){for(int i=1;i<=a[0];i++)if(a[i]!=b[i])return 0;return 1;}
int main()
{
int T;scanf("%d",&T);
while(T--)
{
scanf("%s%s",ch1+1,ch2+1);
a[0]=strlen(ch1+1);
b[0]=strlen(ch2+1);
for(int i=1;i<=a[0];i++)a[i]=ch1[i]-'A';
for(int i=1;i<=b[0];i++)b[i]=ch2[i]-'A';
if(a[0]>b[0])swap(a,b);
while(b[0]>a[0])
{
if(b[b[0]])
{
b[0]--;
reverse(b+1,b+b[0]+1);
}
else b[0]--;
}
while(1)
{
if(judge())
{
for(int i=1;i<=b[0];i++)
if(b[i])printf("B");
else printf("A");
puts("");
break;
}
if(a[a[0]])
{
a[0]--;
reverse(a+1,a+a[0]+1);
}
else a[0]--;
if(b[b[0]])
{
b[0]--;
reverse(b+1,b+b[0]+1);
}
else b[0]--;
if(!a[0]&&!b[0]){puts("-1");break;}
}
}
return 0;
}
rp++