TopCoderコミットテスト
2656 ワード
TopCoderのネットワーク接続がうまくいかず、様々な方法を試した後、Edgeブラウザ+グローバルエージェントで接続しました.エージェントを使わなくてもいいようです. Webサイト:https://arena.topcoder.com ブラシ問題上の欄のPractice Problemをクリックし、テーマをクリックしてページに入るには長い時間ロードする必要があります.Disconnectが表示された後にポイントが続行された場合は、インタフェースで待機し続けます... 問題のロードが完了した後、テストの提出は比較的順調である.Webエディターはカスタムテストをサポートします. テーマの要求に従って相応の方法を実現する必要がある.
一つのABからなる文字列が末尾にA、反転後にBを加えて別の文字列に変換できるかどうかを判断する.
一般的にこのような文字列の修正はDPを思い浮かべやすい.しかし、この問題の主な方法は貪欲であるべきだ.まず2文字列のAB個数差を算出し,Bの差から反転回数を判断する.元の文字列が反転した後、前後に続くBの個数とAを追加する位置を決定できます.ターゲット文字列と比較すればよい.
タイトル:ABBA
一つのABからなる文字列が末尾にA、反転後にBを加えて別の文字列に変換できるかどうかを判断する.
一般的にこのような文字列の修正はDPを思い浮かべやすい.しかし、この問題の主な方法は貪欲であるべきだ.まず2文字列のAB個数差を算出し,Bの差から反転回数を判断する.元の文字列が反転した後、前後に続くBの個数とAを追加する位置を決定できます.ターゲット文字列と比較すればよい.
#include
using namespace std;
typedef long long LL;
class ABBA{
public:
string canObtain(string initial, string target){
int len1 = initial.length();
int len2 = target.length();
int cntA = 0, cntB = 0;
for(char a : initial){
if(a == 'A'){
cntA--;
}
else{
cntB--;
}
}
for(char a : target){
if(a == 'A'){
cntA++;
}
else{
cntB++;
}
}
if (cntB < 0 || cntA < 0) {
return "Impossible";
} else {
int cntL = cntB / 2;
int cntR = cntB - cntL;
bool rev = cntB & 1;
if (rev) {
int p = len2 - 1;
if (!cntR && initial[0] != 'A' && target[0] == 'A') return "Impossible";
while (cntR) {
cntR -= target[p] == 'B';
p--;
}
if (p - len1 + 1 < 0) return "Impossible";
for (int i = 0; i < len1; ++i) {
int pp = p - i;
if (target[pp] != initial[i]) return "Impossible";
}
return "Possible";
}
else{
int p = 0;
if (!cntR && initial[0] != 'A' && target[0] == 'A') return "Impossible";
while (cntL) {
cntL -= target[p] == 'B';
p++;
}
if (p + len1 > len2) return "Impossible";
for (int i = 0; i < len1; ++i) {
int pp = p + i;
if (target[pp] != initial[i]) return "Impossible";
}
return "Possible";
}
}
}
};