題解:P10906 [藍橋杯 2024 國 B] 合法密碼

George222發表於2024-08-23

本來以為字串多大,結果就這點,直接暴力。

列舉起始點,對於每個起始點列舉後面 \(8 \sim 16\) 位有沒有能用的即可。

最後答案為 \(400\)


附:計算程式碼

列舉程式碼如下:

    for (int i = 0; i < n; ++i) {
        for (int length = 8; length <= 16; ++length) {
            if (i + length > n)
                break;
            string substring = s.substr(i, length);
            if (check(substring))
                ++valid_count;
        }
    }

check 函式如下:

    bool has_digit = false;
    bool has_symbol = false;
    unordered_set<char> symbols = {'+', '-', '*', '/', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', '=', '<', '>', '?', '~', '`'};

    for (char c : password) {
        if (isdigit(c))
            has_digit = true;
        else if (symbols.find(c) != symbols.end())
            has_symbol = true;
        if (has_digit && has_symbol)
            return true;
    }
    return false;

相關文章