社区讨论
哈希求助
AT_abc331_f[ABC331F] Palindrome Query参与者 3已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @lpse4r6y
- 此快照首次捕获于
- 2023/12/05 21:43 2 年前
- 此快照最后确认于
- 2023/12/06 11:28 2 年前
过不去 比较小的数据和 hack 数据,这个单模哈希真的过不去嘛?
CPP#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e6 + 100;
ll mod = 325235327;
ll bas = 19441;
char s[N];ll v[N];
struct T{
ll fr, bk, pw;
friend T operator + (T x, T y){
T res;
res.fr = (x.fr * y.pw % mod + y.fr % mod) % mod;
res.bk = (y.bk * x.pw % mod + x.bk % mod) % mod;
res.pw = x.pw * y.pw % mod;
return res;
}
}t[N << 2];
void build(int u, int l, int r){
if(l == r){
t[u].pw = bas;
t[u].fr = t[u].bk = v[s[l] - 'a'];
return ;
}
int mid = (l + r) >> 1;
build(u << 1, l, mid);
build(u << 1 | 1, mid + 1, r);
t[u] = t[u << 1] + t[u << 1 | 1];
}
void upd(int u, int l, ll r, int p, ll k){
if(l == r){
t[u].fr = t[u].bk = k;
return ;
}
int mid = (l + r) >> 1;
if(p <= mid) upd(u << 1, l, mid, p, k);
else upd(u << 1 | 1, mid + 1, r, p, k);
t[u] = t[u << 1] + t[u << 1 | 1];
}
T query(int u, int l, int r, int a, int b){
if(a <= l && r <= b) return t[u];
int mid = (l + r) >> 1;
if(a > mid) return query(u << 1 | 1, mid + 1, r, a, b);
if(b <= mid) return query(u << 1, l, mid, a, b);
return query(u << 1, l, mid, a, b) + query(u << 1 | 1, mid + 1, r, a, b);
}
int main(){
srand(time(0));
for(int i = 0;i < 26;i++) v[i] = 1LL * rand() * rand() * rand() % mod;
int n, q;
scanf("%d%d",&n,&q);
scanf("%s",s+1);
build(1, 1, n);
while(q--){
int opt;
scanf("%d",&opt);
if(opt == 1){
int p;char c;
scanf("%d %c",&p,&c);
upd(1, 1, n, p, v[c - 'a']);
}
else{
int l, r;
scanf("%d%d",&l,&r);
T res = query(1, 1, n, l, r);
if(res.fr == res.bk) puts("Yes");
else puts("No");
}
}
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...