TopCoder提交测试

TopCoder网络连接不是很好,尝试了各种方法后,用Edge浏览器+全局代理连上了。似乎不用代理也可以。

  • 网址:https://arena.topcoder.com
  • 刷题点击上边栏的Practice Problem,点击题目后进入页面需要加载很长时间。如果出现Disconnect之后点继续,继续在界面等待…
  • 题目加载完成后,测试提交较为顺利。网页版编辑器机支持自定义测试。
  • 需要根据题目的要求实现相应方法。

题目:ABBA

判断一个AB组成的字符串是否可以通过末尾加A、翻转后加B变换成为另一个字符串。

一般这种字符串修改的容易想到DP。不过这道题主要方法应该是贪心。首先计算出两个字符串的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";
            }
        }

    }
};

你可能感兴趣的:(acm练习)