Submission #1228829

#TimeUsernameProblemLanguageResultExecution timeMemory
1228829meth_enjoyerCrossing (JOI21_crossing)C++20
26 / 100
170 ms17824 KiB
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxN = 2e5 + 5;
const ll mod = 1e9 + 433;
const ll base = 31;
int n, q;
string s[4], t;
ll p[maxN], sum[maxN];

void init(){
    p[0] = 1;
    for (int i = 1; i <= n; ++i){
        p[i] = p[i - 1] * base % mod;
        sum[i] = (sum[i - 1] + p[i - 1]) % mod;
    }
}

ll cong(ll a, ll b){
    return (a % mod + b % mod) % mod;
}

ll nhan(ll a, ll b){
    return a % mod * b % mod;
}

ll tru(ll a, ll b){
    return (a - b + mod * (a - b < 0));
}

ll get_hash(string& f){
    ll res = 0;
    for (const auto& x : f){
        res = res * base + x;
        res%= mod;
    }
    return res;
}

struct seg{
    vector<ll> st, lazy;

    seg(int n = 0) {
        st.assign(n << 2 | 3, 0);
        lazy.assign(n << 2 | 3, 0);
    }

    void down(int id, int l, int mid, int r){
        ll val = lazy[id];
        if (!val) return;
        lazy[id << 1] = lazy[id << 1 | 1] = val;

        st[id << 1] = nhan(val, sum[mid - l + 1]);
        st[id << 1 | 1] = nhan(val, sum[r - mid]);
        lazy[id] = 0;
    }

    ll set_val(ll a, ll b, int len){
        return cong(nhan(a, p[len]), b);
    }

    void build(int id, int l, int r, string& f){
        if (l == r){
            st[id] = f[l - 1];
            return;
        }
        int mid = (l + r) >> 1;
        build(id << 1, l, mid, f);
        build(id << 1 | 1, mid + 1, r, f);
        st[id] = set_val(st[id << 1], st[id << 1 | 1], r - mid);
    }

    void update(int id, int l, int r, int u, int v, int val){
        if (l > v || r < u) return;
        if (u <= l && r <= v) {
            st[id] = nhan(val, sum[r - l + 1]);
            lazy[id] = val;
            return;
        }

        int mid = (l + r) >> 1;
        down(id, l, mid, r);

        update(id << 1, l, mid, u, v, val);
        update(id << 1 | 1, mid + 1, r, u, v, val);
        st[id] = set_val(st[id << 1], st[id << 1 | 1], r - mid);
    }

};

seg st(maxN);

void solve(){
    st.build(1, 1, n, t);
    ll temp = get_hash(s[1]);
    if (st.st[1] == temp)
        cout << "Yes";
    else
        cout << "No";
    cout << '\n';
    while (q--){
        int l, r;
        char val;
        cin >> l >> r >> val;
        st.update(1, 1, n, l, r, val);
        if (st.st[1] == temp)
            cout << "Yes";
        else
            cout << "No";
        cout << '\n';
    }
}

int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
//    freopen("a.inp", "r", stdin);
//    freopen("a.out", "w", stdout);
    cin >> n;
    for (int i = 1; i < 4; ++i)
        cin >> s[i];
    cin >> q;
    cin >> t;
    init();
    solve();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...