TTPC2015 C おおおかやま

2015/09/28 (Mon) AtCoder TTPC 文字列 実装

問題

日本語

方針

書かれているとおりに実装する(つらい).ちゃんとした解法もあるけど $|S| \leq 100$ なのでこれで十分.

実装

string op1(string s);
string op2(string s);
string op3(string s);
string op4(string s);

string ookayama = "ookayama";

string op1(string s){
    dump(s);
    size_t pos = s.find("o" + ookayama);
    if(pos != string::npos){
        return op2(s);
    } else {
        return s;
    }
}

string op2(string s){
    dump(s);
    vector<pair<int,int>> oos; // len, begin pos
    rep(i,s.size() - ookayama.size() + 1){
        if(s.substr(i, ookayama.size()) == ookayama){
            int j = i + 1;
            while(j >= 0 && s[j] == 'o') j--;
            if(i+2-j >= 3) oos.eb(i + ookayama.size() - (j+1), j+1);
        }
    }
    if(oos.size() == 0) while(1);
    int len = 0, pos = -1;
    for(auto & e : oos){
        if(e.first > len){
            len = e.first;
            pos = e.second;
        }
    }
    string t = s.substr(pos,len);
    return op1(s.substr(0,pos) + op3(t) + s.substr(pos+len));
}

string op3(string t){
    dump(t);
    bool found = false;
    rep(i,t.size()-1){
        if(t[i] == 'o' && t[i+1] == 'o'){
            t[i] = 'O';
            t.erase(t.begin()+i+1);
            found = true;
            break;
        }
    }
    if(found) return op4(t);
    else return t;
}

string op4(string t){
    dump(t);
    rep(i,t.size()-1){
        if(t[i] == 'O' && t[i+1] == 'O'){
            t[i] = 'o';
            t.erase(t.begin()+i+1);
            break;
        }
    }
    return op3(t);
}

string solve(string s){
    return op1(s);
}

signed main(){
    string s;
    while(cin >> s){
        cout << solve(s) << endl;
    }
}