おじさんの競プロ記録

自分の力で解答できた問題を振り返り、理解を深めたいです。

AtCoder Beginner Contest 196 C - Doubled

問題

問題文へ

整数Nが与えられます。 以下の条件を満たす1以上N以下の整数xは何個あるでしょうか? * xの十進表記(先頭に0を付けない)は偶数桁であり、その前半と後半は文字列として等しい。

制約

  • Nは整数
  •  1 \leq N \lt 10^{12}

考えたこと

前半と後半にわけてそれぞれ作ってみようと思いました。

コード

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


int main(void) {
    string N;
    cin >> N;

    if (stoll(N) < 11) {
        cout << 0 << endl;
        return 0;
    }

    ll ans = 0;
    if (N.length() % 2 != 0) {
        string n;
        rep(i, N.length() - 1) {
            n.push_back('9');
        }
        N = n;
    }

    string l = N.substr(0, N.length() / 2);
    string r = N.substr(N.length() / 2);

    ll numl = stoll(l);
    ll numr = stoll(r);

    if (numl <= numr) ans = numl;
    else ans = numl - 1;
    
    cout << ans << endl;

    return 0;
}

解説を読んで

全探索でいいとは…。