はまやんはまやんはまやん

hamayanhamayan's blog

Did you mean... [Codeforces Round #434 A]

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());
    }
}