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

hamayanhamayan's blog

Validation [第七回 アルゴリズム実技検定 C]

https://atcoder.jp/contests/past202107-open/tasks/past202107_c

解説

https://atcoder.jp/contests/past202107-open/submissions/24460011

要求されている判定を行う実装問題。
自分の実装では色々な工夫をすることで、なるべく実装を減らしている。

まずSの長さの最大値が100であるが、Rの最大値が109で、先頭の0も認められないので、
文字数は11文字以上であれば必ず条件を満たさないことが分かる。
よって、文字数が11文字以上ならばとりあえずNoとしていい。

そうすると、文字列Sを数値に変換するときにlong longに収まる範囲になるので、stoll関数を使って文字列を数に変換する。
数になっていると大小関係の比較がしやすいので、[L,R]の範囲にあるかどうかを効率よく判定できる。

面倒な判定が、先頭に不要な0があるかどうかである。
自分は数に変換した後改めて文字列に直したときに全く同じ文字列になれば先頭な0が無いと判断する実装を行った。
先頭が0であるかどうかを判定基準としてもいいのだが、S=0のときにちょっと場合分けが必要となるので注意。

string S;
int L, R;
//---------------------------------------------------------------------------------------------------
#define yes "Yes"
#define no "No"
string solve() {
    if (11 <= S.length()) return no;

    ll n = stoll(S);

    // 先頭に不要な0があったのでダメ
    if (to_string(n) != S) return no;

    if (L <= n && n <= R) return yes;
    return no;
}
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> S >> L >> R;
    cout << solve() << endl;
}