Submission #1240373

#TimeUsernameProblemLanguageResultExecution timeMemory
1240373goodluck2020Palindrome-Free Numbers (BOI13_numbers)C++17
2.50 / 100
1099 ms71260 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

string s;
map<tuple<int, bool, bool, string>, ll> memo;

// Hàm kiểm tra nếu một chuỗi là palindrome
bool is_palindrome(const string &s) {
    int l = 0, r = s.size() - 1;
    while (l < r) {
        if (s[l] != s[r]) return false;
        ++l; --r;
    }
    return true;
}

// Kiểm tra nếu vector chữ số hiện tại chứa substring palindrome dài ≥ 3
bool has_palindrome(const string &digits) {
    int n = digits.size();
    for (int len = 3; len <= n; ++len) {
        for (int i = 0; i + len <= n; ++i) {
            string sub = digits.substr(i, len);
            if (is_palindrome(sub))
                return true;
        }
    }
    return false;
}

// Digit DP
ll dfs(int pos, bool tight, bool leading_zero, string last_digits) {
    if (has_palindrome(last_digits)) return 0;  // không hợp lệ

    if (pos == s.size()) return 1; // hợp lệ

    auto key = make_tuple(pos, tight, leading_zero, last_digits);
    if (memo.count(key)) return memo[key];

    ll res = 0;
    int limit = tight ? s[pos] - '0' : 9;

    for (int d = 0; d <= limit; ++d) {
        bool new_tight = tight && (d == limit);
        bool new_leading = leading_zero && (d == 0);
        string new_last = last_digits;

        if (!new_leading) {
            new_last += (char)(d + '0');
            if (new_last.size() > 10) // chỉ giữ 10 chữ số cuối
                new_last.erase(0, 1);
        }

        res += dfs(pos + 1, new_tight, new_leading, new_last);
    }

    return memo[key] = res;
}

ll count_palindrome_free(ll x) {
    if (x < 0) return 0;
    s = to_string(x);
    memo.clear();
    return dfs(0, true, true, "");
}

int main() {
    ll a, b;
    cin >> a >> b;

    ll ans = count_palindrome_free(b) - count_palindrome_free(a - 1);
    cout << ans << "\n";

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...