QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#705763#9536. Athlete Welcome Ceremonyucup-team3584#WA 1ms3824kbC++235.3kb2024-11-03 01:26:512024-11-03 01:26:52

Judging History

This is the latest submission verdict.

  • [2024-11-03 01:26:52]
  • Judged
  • Verdict: WA
  • Time: 1ms
  • Memory: 3824kb
  • [2024-11-03 01:26:51]
  • Submitted

answer

#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef unsigned long long int ull;

mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
ll myRand(ll B) { return (ull)rng() % B; }
inline double time() {
    return static_cast<long double>(chrono::duration_cast<chrono::nanoseconds>(chrono::steady_clock::now().time_since_epoch()).count()) * 1e-9;
}

template <int mod> struct static_modint {
    using mint = static_modint;
    int x;

    static_modint() : x(0) {}
    static_modint(int64_t y) : x(y >= 0 ? y % mod : (mod - (-y) % mod) % mod) {}

    mint &operator+=(const mint &rhs) {
        if ((x += rhs.x) >= mod) x -= mod;
        return *this;
    }
    mint &operator-=(const mint &rhs) {
        if ((x += mod - rhs.x) >= mod) x -= mod;
        return *this;
    }
    mint &operator*=(const mint &rhs) {
        x = (int)(1LL * x * rhs.x % mod);
        return *this;
    }
    mint &operator/=(const mint &rhs) { return *this = *this * rhs.inv(); }

    mint pow(long long n) const {
        mint _x = *this, r = 1;
        while (n) {
            if (n & 1) r *= _x;
            _x *= _x;
            n >>= 1;
        }
        return r;
    }
    mint inv() const { return pow(mod - 2); }

    mint operator+() const { return *this; }
    mint operator-() const { return mint() - *this; }
    friend mint operator+(const mint &lhs, const mint &rhs) { return mint(lhs) += rhs; }
    friend mint operator-(const mint &lhs, const mint &rhs) { return mint(lhs) -= rhs; }
    friend mint operator*(const mint &lhs, const mint &rhs) { return mint(lhs) *= rhs; }
    friend mint operator/(const mint &lhs, const mint &rhs) { return mint(lhs) /= rhs; }
    friend bool operator==(const mint &lhs, const mint &rhs) { return lhs.x == rhs.x; }
    friend bool operator!=(const mint &lhs, const mint &rhs) { return lhs.x != rhs.x; }

    friend ostream &operator<<(ostream &os, const mint &p) { return os << p.x; }
    friend istream &operator>>(istream &is, mint &a) {
        int64_t t;
        is >> t;
        a = static_modint<mod>(t);
        return (is);
    }
};

const unsigned int mod = 1e9 + 7;
using modint = static_modint<mod>;
modint mod_pow(ll n, ll x) { return modint(n).pow(x); }
modint mod_pow(modint n, ll x) { return n.pow(x); }

int main() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    int n, q;
    cin >> n >> q;
    string s;
    cin >> s;
    vector<vector<modint>> dp[3];
    for (auto &i : dp) {
        i.resize(n + 1, vector<modint>(n + 1, 0));
    }
    if (s[0] == '?') {
        dp[0][1][0] = 1;
        dp[1][0][1] = 1;
        dp[2][0][0] = 1;
    } else {
        dp[s[0] - 'a'][0][0] = 1;
    }
    for (int i = 1; i < n; i++) {
        vector<vector<modint>> ndp[3];
        for (auto &j : ndp) {
            j.resize(n + 1, vector<modint>(n + 1, 0));
        }
        if (s[i] != '?') {
            for (int j = 0; j < 3; ++j) {
                if (j == (s[i] - 'a')) continue;
                for (int k = 0; k <= n; ++k) {
                    for (int l = 0; l <= n; ++l) {
                        ndp[s[i] - 'a'][k][l] += dp[j][k][l];
                    }
                }
            }
        } else {
            for (int j = 0; j < 3; ++j) {
                for (int k = 0; k <= n; ++k) {
                    for (int l = 0; l <= n; ++l) {
                        if (dp[j][k][l] == 0) continue;
                        for (int m = 0; m < 3; ++m) {
                            if (m == j) continue;
                            if (m == 0) {
                                ndp[0][k + 1][l] += dp[j][k][l];
                            } else if (m == 1) {
                                ndp[1][k][l + 1] += dp[j][k][l];
                            } else {
                                ndp[2][k][l] += dp[j][k][l];
                            }
                        }
                    }
                }
            }
        }
        swap(dp, ndp);
    }
    int cnt = 0;
    for (char c : s) {
        if (c == '?') cnt++;
    }
    vector<vector<modint>> sum(n + 1, vector<modint>(n + 1, 0));
    vector<vector<modint>> ab(n + 1, vector<modint>(n + 1, 0));
    for (int i = 0; i <= n; ++i) {
        for (int j = 0; j <= n; ++j) {
            sum[i][j] = dp[0][i][j] + dp[1][i][j] + dp[2][i][j];
            if (sum[i][j] != 0) {
                ab[i + j][i] += sum[i][j];
            }
            if (j) sum[i][j] += sum[i][j - 1];
        }
        for (int j = 1; j <= n; ++j) {
            sum[j][i] += sum[j - 1][i];
        }
    }
    for (int i = 0; i <= n; ++i) {
        for (int j = 1; j <= n; ++j) {
            ab[i][j] += ab[i][j - 1];
        }
        for (int j = 1; j <= n; ++j) {
            ab[j][i] += ab[j - 1][i];
        }
    }
    while (q--) {
        int a, b, c;
        cin >> a >> b >> c;
        a = min(a, n);
        b = min(b, n);
        c = min(c, n);
        modint res = sum[a][b];
        for (int i = 0; i <= n; ++i) {
            if (i + c >= cnt) break;
            int l = 0, r = min(i, a);
            l = max(l, i - b);
            if (l <= r) {
                res -= ab[i][r] - (l ? ab[i][l - 1] : 0);
            }
        }
        cout << res << endl;
    }
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 3640kb

input:

6 3
a?b??c
2 2 2
1 1 1
1 0 2

output:

3
1
1

result:

ok 3 lines

Test #2:

score: 0
Accepted
time: 0ms
memory: 3812kb

input:

6 3
??????
2 2 2
2 3 3
3 3 3

output:

30
72
96

result:

ok 3 lines

Test #3:

score: 0
Accepted
time: 0ms
memory: 3592kb

input:

1 1
?
0 1 1

output:

2

result:

ok single line: '2'

Test #4:

score: -100
Wrong Answer
time: 1ms
memory: 3824kb

input:

10 10
acab?cbaca
0 2 0
1 1 2
4 2 3
1 1 1
3 5 1
0 5 2
2 2 0
1 2 5
4 3 0
1 1 3

output:

0
1
0
1
1
0
1
1
0
1

result:

wrong answer 3rd lines differ - expected: '1', found: '0'