いろいろがんばりたいブログ

情報科学科の人がいろいろ書きます。

TopCoder SRM 572 NextOrPrev

本番ではiとjの間違いで死んだ。

条件がすごい厄介

class NextOrPrev {
    public:
        int getMinimum(int nextCost, int prevCost, string start, string goal) {
            vector<pair<char,char> > up;
            vector<pair<char,char> > down;
            vector<char> non;
            for(int i=0;i<start.size();i++){
                if(start[i] == goal[i]) non.push_back(start[i]);
                else if(start[i] < goal[i]) up.push_back(mp(start[i],goal[i]));
                else down.push_back(mp(start[i],goal[i]));
            }

            bool ok = true;
            sort(all(up));
            for(int i=1;i<up.size();i++){
                if(up[i].second < up[i-1].second) ok = false;
            }


            sort(rall(down));
            for(int i=1;i<down.size();i++){
                if(down[i].second > down[i-1].second) ok = false;
            }

            for(int j=0;j<non.size();j++){
                for(int i=0;i<up.size();i++){
                    if(up[i].first < non[j] and non[j] < up[i].second) ok = false;
                }
                for(int i=0;i<down.size();i++){
                    if(down[i].second < non[j] and non[j] < down[i].first) ok = false;
                }
            }

            for(int i=0;i<up.size();i++){
                for(int j=0;j<down.size();j++){
                    char a = up[i].first;
                    char b = up[i].second;
                    char c = down[j].second;
                    char d = down[j].first;
                    if(a <= c and c <= b) ok = false;
                    if(a <= d and d <= b) ok = false;
                    if(c <= a and a <= d) ok = false;
                    if(c <= b and b <= d) ok = false;
                }
            }
            if(ok){
                int ret = 0;
                for(int i=0;i<up.size();i++){
                    ret += (up[i].second - up[i].first)  * nextCost;
                }
                for(int i=0;i<down.size();i++){
                    ret += (down[i].first - down[i].second) * prevCost;
                }
                return ret;
            }else{
                return -1;
            }
         }
};