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

hamayanhamayan's blog

Alex and broken contest [Codeforces Round #442 A]

http://codeforces.com/contest/877/problem/A

文字列Sがある。
この文字列に"Danil", "Olya", "Slava", "Ann", "Nikita"のうちいずれかが丁度1つあるか判定せよ。
len(S)≦100

解法

http://codeforces.com/contest/877/submission/31667307

"Danil", "Olya", "Slava", "Ann", "Nikita"の個数をカウントして丁度1ならYESという実装にした。
 
追記: システムテスト落ちたので修正
http://codeforces.com/contest/877/submission/31634738
落ちた原因はstringのlengthメソッドのsize_t型。
size_tは条件式の中で使うとおかしなことにあることで有名。
どういう落とし穴があるかはyukicoderのこの問題の解説が詳しい

string S;
string dic[5] = { "Danil", "Olya", "Slava", "Ann", "Nikita" };
//---------------------------------------------------------------------------------------------------
#define yes "YES"
#define no "NO"
string solve() {
    int N = S.length();
    int c = 0;
    rep(j, 0, 5) {
        int m = dic[j].length();
        rep(i, 0, N - m + 1) {
            int ok = 1;
            rep(k, 0, m) if (S[i + k] != dic[j][k]) ok = 0;
            if (ok) c++;
        }
    }

    if (c == 1) return yes;
    return no;
}
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> S;
    cout << solve() << endl;
}