http://codeforces.com/contest/860/problem/A
条件がある
1. 3つ以上の子音が隣り合ってはいけない
2. しかし、隣り合っている子音が全て同じ文字であれば隣り合ってもよい
隣り合わないようにスペースを最小個数入れよ
http://codeforces.com/contest/860/submission/30424518
子音の塊をまず作る。(配列v)
あとは、条件を満たすように貪欲に分けていくだけ。
string S; int N; string B = "aiueo"; //--------------------------------------------------------------------------------------------------- void _main() { while (cin >> S) { N = S.length(); // 子音範囲を抜き出す vector<pair<int, int>> v; int pre = -1; rep(i, 0, N) { if (B.find(S[i]) != string::npos) { // boin if (0 <= pre) { v.push_back({ pre, i - 1 }); pre = -1; } } else { // shiin if (pre < 0) pre = i; } } if (0 <= pre) v.push_back({ pre, N - 1 }); int idx = 0; string ans = ""; fore(p, v) { int L = p.first; int R = p.second; ans += S.substr(idx, L - idx); // 条件を満たすまでスペースで分割 while (3 <= R - L + 1) { if (S[L] == S[L + 1] && S[L + 1] == S[L + 2]) { int c = 0; rep(i, L, R + 1) { if (S[i] == S[L]) c++; else break; } if (R - L + 1 == c) { ans += S.substr(L, c); L += c; break; } ans += S.substr(L, c) + " "; L += c; } else { ans += S.substr(L, 2) + " "; L += 2; } } ans += S.substr(L, R - L + 1); idx = R + 1; } ans += S.substr(idx, N - idx); printf("%s\n", ans.c_str()); } }