线段树上的hash...
#include <bits/stdc++.h> using namespace std; typedef long long LL; #define lson o << 1, L, mid #define rson o << 1 | 1, mid+1, R #define ls o << 1 #define rs o << 1 | 1 const int mod = 1e9+7; const int maxn = 100005; const LL x = 1e6+3; LL sum[maxn << 2]; LL lazy[maxn << 2]; LL xp[maxn]; LL xp_sum[maxn]; char a[maxn]; int n, m; void pushup(int o, int L, int R) { int mid = (L + R) >> 1; sum[o] = (sum[ls] + sum[rs] * xp[mid - L + 1]) % mod; } void pushdown(int o, int L, int R) { if(lazy[o]) { int mid = (L + R) >> 1; sum[ls] = lazy[o] * xp_sum[mid-L] % mod; sum[rs] = lazy[o] * xp_sum[R-mid-1] % mod; lazy[ls] = lazy[rs] = lazy[o]; lazy[o] = 0; } } void build(int o, int L, int R) { lazy[o] = 0; if(L == R) { sum[o] = a[L]; return; } int mid = (L + R) >> 1; build(lson); build(rson); pushup(o, L, R); } void update(int o, int L, int R, int ql, int qr, int v) { if(ql <= L && qr >= R) { sum[o] = xp_sum[R-L] * v % mod; lazy[o] = v; return; } pushdown(o, L, R); int mid = (L + R) >> 1; if(ql <= mid) update(lson, ql, qr, v); if(qr > mid) update(rson, ql, qr, v); pushup(o, L, R); } LL query(int o, int L, int R, int ql, int qr) { if(ql <= L && qr >= R) return sum[o]; pushdown(o, L, R); int mid = (L + R) >> 1; if(ql > mid) return query(rson, ql, qr); else if(qr <= mid) return query(lson, ql, qr); else { LL t1 = query(lson, ql, qr); LL t2 = query(rson, ql, qr); int tt = mid - max(ql, L) + 1; return (t1 + t2 * xp[tt]) % mod; } pushup(o, L, R); } void init() { xp[0] = xp_sum[0] = 1; for(int i = 1; i < maxn; i++) xp[i] = xp[i-1] * x % mod, xp_sum[i] = (xp_sum[i-1] + xp[i]) % mod; } void work() { int k; scanf("%d%d%d", &n, &m, &k); m += k; scanf("%s", a+1); for(int i = 1; i <= n; i++) a[i] = a[i] - '0' + 1; build(1, 1, n); while(m--) { int op, ql, qr, c; scanf("%d%d%d%d", &op, &ql, &qr, &c); if(op == 1) { c++; update(1, 1, n, ql, qr, c); } else { if(c == qr - ql + 1) { printf("YES\n"); continue; } LL t1 = query(1, 1, n, ql, qr-c); LL t2 = query(1, 1, n, ql+c, qr); if(t1 == t2) printf("YES\n"); else printf("NO\n"); } } } int main() { //freopen("data", "r", stdin); init(); work(); return 0; }