文学徒が競プロをするブログ

競技プログラミングの精進を記録していきます

AOJ ICPC CatChecker

AOJ ICPC CatChecker

解説ACしたので簡単に自分の頭の整理をします。

問題文

文字列が与えられるのでそれが「CAT文字列」かどうか判定してください。CAT文字列は最初空文字で、以下のように再帰的に定義されます。
CAT = 'm'+CAT+'e'+CAT+'w

考えたこと

いや再帰っぽいけどわかんねえ→まあよく考えるとハンバーガーだよね、わかるわかる→は?まずハンバーガーを解けませんが→えーハンバーガー解き直したけど解けない→解法見たけどハンバーガーやるだけじゃん、おわりです。

真面目に

ハンバーガーことD - Christmasのように「再帰的に潜りながら線形探索をする」と解ける。典型が全然身についていないのでとてもつらい。ちなみにこの「再帰的に線形探索」はくるさんが教えてくれた表現です。わりと好き。

コード

#include <bits/stdc++.h>
#define ll long long
#define rep(i,n) for(int i=0;i<n;++i)
using namespace std;

string s;
int ind = 0;

void solve() {
    if (s[ind] != 'm') {
        return;
    }
    ++ind;
    solve();
    if (s[ind] != 'e') {
        return;
    }
    ++ind;
    solve();
    if (s[ind] != 'w') {
        return;
    }
    ++ind;
    return;
}

int main() {
    cin >> s;
    int n = s.length();
    solve();
    if (ind == n) cout << "Cat" << endl;
    else cout << "Rabbit" << endl;
}