线段树维护字符串哈希

#include <bits/stdc++.h> using namespace std; #define endl "\n" #define int long long typedef long long ll; const int base = 131; const int p1 = 1222827239; const int N = 1e6 + 100; int n, q, pn[N]; string s; struct node { int lsum, rsum, len; node() {lsum = rsum = 0;} } Seg[N * 4]; node operator + (const node &l, const node &r) { node ans; ans.lsum = (l.lsum + pn[l.len] * r.lsum % p1) % p1; ans.rsum = (r.rsum + pn[r.len] * l.rsum % p1) % p1; ans.len = l.len + r.len; return ans; } void pushup(int id) { Seg[id] = Seg[id * 2] + Seg[id * 2 + 1]; } void build(int id, int l, int r) { Seg[id].len = r - l + 1; if (l == r) { Seg[id].lsum = Seg[id].rsum = s[l]; return; } int mid = l + r >> 1; build(id * 2, l, mid); build(id * 2 + 1, mid + 1, r); pushup(id); } void modify(int id, int l, int r, int pos, char c) { if (l == r) { Seg[id].lsum = Seg[id].rsum = c; return; } int mid = l + r >> 1; if (pos <= mid) modify(id * 2, l, mid, pos, c); else modify(id * 2 + 1, mid + 1, r, pos, c); pushup(id); } node query(int id, int l, int r, int x, int y) { if (x <= l && y >= r) return Seg[id]; int mid = l + r >> 1; if (y <= mid) return query(id * 2, l, mid, x, y); if (x > mid) return query(id * 2 + 1, mid + 1, r, x, y); return query(id * 2, l, mid, x, y) + query(id * 2 + 1, mid + 1, r, x, y); } void solve() { cin >> n >> q >> s; s = " " + s; pn[0] = 1; for (int i = 1; i <= n; i++) pn[i] = pn[i - 1] * 1ll * base % p1; build(1, 1, n); while (q--) { int op; cin >> op; if (op == 1) { int pos; cin >> pos; char c; cin >> c; modify(1, 1, n, pos, c); } else { int l, r; cin >> l >> r; node ans = query(1, 1, n, l, r); if (ans.lsum == ans.rsum) cout << "Yes" << endl; else cout << "No" << endl; } } } signed main() { ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); // int T = 1; cin >> T; // while(T--) solve(); solve(); return 0; }

#include <bits/stdc++.h> using namespace std; #define endl "\n" #define int long long typedef long long ll; const int N = 1e6 + 100; const int mod = 1222827239; const int base = 131; int n, m, k, pn[N], pre[N]; string s; struct node { int sum, tag, len; } Seg[N * 4]; void settag(int id, int v) { // cout << Seg[id].len << endl; Seg[id].sum = pre[Seg[id].len - 1] % mod * v % mod; Seg[id].tag = v; } void pushup(int id) { Seg[id].sum = (Seg[id * 2].sum + pn[Seg[id * 2].len] * Seg[id * 2 + 1].sum % mod) % mod; } void pushdown(int id) { if (Seg[id].tag) { settag(id * 2, Seg[id].tag); settag(id * 2 + 1, Seg[id].tag); Seg[id].tag = 0; } } void build(int id, int l, int r) { Seg[id].len = r - l + 1; Seg[id].tag = 0; if (l == r) { Seg[id].sum = s[l]; return; } int mid = l + r >> 1; build(id * 2, l, mid); build(id * 2 + 1, mid + 1, r); pushup(id); } void modify(int id, int l, int r, int x, int y, char c) { if (x <= l && y >= r) { settag(id, c); return; } pushdown(id); int mid = l + r >> 1; if (x <= mid) modify(id * 2, l, mid, x, y, c); if (y > mid) modify(id * 2 + 1, mid + 1, r, x, y, c); pushup(id); } int query(int id, int l, int r, int x, int y) { if (x <= l && y >= r) return Seg[id].sum; pushdown(id); int mid = l + r >> 1; if (y <= mid) return query(id * 2, l, mid, x, y); if (x > mid) return query(id * 2 + 1, mid + 1, r, x, y); int ls = query(id * 2, l, mid, x, y), rs = query(id * 2 + 1, mid + 1, r, x, y), ans; ans = (ls + rs * pn[mid - max(l, x) + 1] % mod) % mod; return ans; } void solve() { cin >> n >> m >> k >> s; s = " " + s; build(1, 1, n); for (int i = 1; i <= m + k; i++) { int op, l, r; cin >> op >> l >> r; if (op == 1) { char d; cin >> d; modify(1, 1, n, l, r, d); } else { int d; cin >> d; if (d == r - l + 1) { cout << "YES" << endl; continue; } int v1 = query(1, 1, n, l, r - d) % mod; int v2 = query(1, 1, n, l + d, r) % mod; cout << (v1 == v2 ? "YES" : "NO") << endl; } } } signed main() { ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); // int T = 1; cin >> T; // while(T--) solve(); pre[0] = pn[0] = 1; for (int i = 1; i <= N - 100; i++) pn[i] = pn[i - 1] * 1ll * base % mod, pre[i] = (pre[i - 1] + pn[i]) % mod; solve(); return 0; }
参考这位的P2757 [国家集训队]等差子序列 - GsjzTle思路

#include <bits/stdc++.h> using namespace std; #define endl "\n" #define int long long typedef long long ll; const int N = 3e5 + 100; const int mod = 1222827239; const int base = 131; int pn[N]; struct node { int lsum, rsum, len; } Seg[N * 4]; void pushup(int id) { Seg[id].lsum = (Seg[id * 2].lsum + pn[Seg[id * 2].len] * Seg[id * 2 + 1].lsum % mod) % mod; Seg[id].rsum = (Seg[id * 2 + 1].rsum + pn[Seg[id * 2 + 1].len] * Seg[id * 2].rsum % mod) % mod; } void build(int id, int l, int r) { Seg[id].len = r - l + 1; if (l == r) { Seg[id].lsum = Seg[id].rsum = 0; return; } int mid = l + r >> 1; build(id * 2, l, mid); build(id * 2 + 1, mid + 1, r); pushup(id); } void modify(int id, int l, int r, int pos, int v) { if (l == r) { Seg[id].lsum = Seg[id].rsum = v; return; } int mid = l + r >> 1; if (pos <= mid) modify(id * 2, l, mid, pos, v); else modify(id * 2 + 1, mid + 1, r, pos, v); pushup(id); } int query(int id, int l, int r, int x, int y, int tag) { if (x <= l && y >= r) { if (tag) return Seg[id].lsum; else return Seg[id].rsum; } int mid = l + r >> 1; if (y <= mid) return query(id * 2, l, mid, x, y, tag); if (x > mid) return query(id * 2 + 1, mid + 1, r, x, y, tag); int ls = query(id * 2, l, mid, x, y, tag), rs = query(id * 2 + 1, mid + 1, r, x, y, tag), ans; //----------------------------- // 一定要这样写 // pn[mid - max(x, l) + 1] // pn[min(y, r) - mid] //----------------------------- if (tag) ans = (ls + pn[mid - max(x, l) + 1] * rs % mod) % mod; else ans = (rs + pn[min(y, r) - mid] * ls % mod) % mod; return ans; } void solve() { int n; cin >> n; build(1, 1, n); bool ok = false; for (int i = 1; i <= n; i++) { int x; cin >> x; int len = min(x, n - x + 1); modify(1, 1, n, x, 1); if (i == 1 || i == n) continue; int v1 = query(1, 1, n, x - len + 1, x, 0); int v2 = query(1, 1, n, x, x + len - 1, 1); if (v1 != v2) ok = true; } if (ok) cout << "Y" << endl; else cout << "N" << endl; } signed main() { ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); pn[0] = 1; for (int i = 1; i < N; i++) pn[i] = pn[i - 1] * base % mod; solve(); // int T = 1; cin >> T; // while (T--) solve(); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端