TTPC2015 C おおおかやま
問題
方針
書かれているとおりに実装する(つらい).ちゃんとした解法もあるけど $|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;
}
}