社区讨论

哈希求助

AT_abc331_f[ABC331F] Palindrome Query参与者 3已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@lpse4r6y
此快照首次捕获于
2023/12/05 21:43
2 年前
此快照最后确认于
2023/12/06 11:28
2 年前
查看原帖
过不去 nn 比较小的数据和 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 条回复,欢迎继续交流。

正在加载回复...