Submission #950477

#TimeUsernameProblemLanguageResultExecution timeMemory
950477glebustimCrossing (JOI21_crossing)C++17
26 / 100
7098 ms7032 KiB
#include <bits/extc++.h>
using namespace std;
using namespace __gnu_pbds;

#define fast ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define all(a) a.begin(), a.end()
using ll = long long;
using ld = long double;
using pii = pair<int, int>;
using vi = vector<int>;
using oset = tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update>;

const ll MOD = 1e18 + 3, P = 5;
const vector<array<int, 3>> o = {{0, 0, 1}, {0, 1, 0}, {1, 0, 0}, {0, 2, 2}, {2, 0, 2}, {2, 2, 0}, {1, 1, 2}, {1, 2, 1}, {2, 1, 1}};
int n;
vi A, B, C;
unordered_set<string> ps;

void all_combs() {
    for (auto x: o) {
        string s(n, '.');
        for (int i = 0; i < n; ++i) {
            int y = (A[i] * x[0] + B[i] * x[1] + C[i] * x[2]) % 3;
            if (y == 0)
                s[i] = 'J';
            else if (y == 1)
                s[i] = 'O';
            else
                s[i] = 'I';
        }
        ps.insert(s);
    }
}

void check_string(string &s) {
    if (ps.find(s) != ps.end())
        cout << "Yes\n";
    else
        cout << "No\n";
}

int main() {
    fast;
    cin >> n;
    A.resize(n);
    B.resize(n);
    C.resize(n);
    string s;
    cin >> s;
    for (int i = 0; i < n; ++i) {
        if (s[i] == 'J')
            A[i] = 0;
        else if (s[i] == 'O')
            A[i] = 1;
        else
            A[i] = 2;
    }
    cin >> s;
    for (int i = 0; i < n; ++i) {
        if (s[i] == 'J')
            B[i] = 0;
        else if (s[i] == 'O')
            B[i] = 1;
        else
            B[i] = 2;
    }
    cin >> s;
    for (int i = 0; i < n; ++i) {
        if (s[i] == 'J')
            C[i] = 0;
        else if (s[i] == 'O')
            C[i] = 1;
        else
            C[i] = 2;
    }
    all_combs();
    int q;
    cin >> q >> s;
    check_string(s);
    while (q--) {
        int l, r;
        char c;
        cin >> l >> r >> c;
        --l;
        --r;
        for (int i = l; i <= r; ++i)
            s[i] = c;
        check_string(s);
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...