首页 > 其他分享 >线段树维护字符串哈希

线段树维护字符串哈希

时间:2024-02-08 19:33:04浏览次数:31  
标签:int 线段 mid Seg 哈希 ans 字符串 lsum id

[ABC331F] Palindrome Query

#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;    
}
View Code

 

标签:int,线段,mid,Seg,哈希,ans,字符串,lsum,id
From: https://www.cnblogs.com/zhujio/p/18012053

相关文章

  • # yyds干货盘点 # Pandas中想剔除字符串中的【第】和【批】这两个字如何做?
    大家好,我是皮皮。一、前言前几天在Python白银交流群【东哥】问了一个Pandas数据处理的问题。问题如下所示:大佬们,有个奇怪的问题请教下,我想剔除字符串中的【第】和【批】这两个字,我写成df["合同名称"]=df["合同名称"].str.replace("第","").replace("批",""),结果只是替换了【第......
  • 字符串
    #include<stdio.h>//打印字符串//这种由双引号(DoubleQuote)引起的一串字符称为字符串字面值(StringLiteral),或者简称字符串。//字符串的结束标志是一个\0的转义字符。在计算字符串长度的时候\0是结束标志,不算作字符串内容。intmain(){ chararr1[]="hello"; chararr2[]......
  • Go语言的100个错误使用场景(30-40)|数据类型与字符串使用
    目录前言4.控制结构4.1忽视元素在range循环中是拷贝(#30)4.2忽略在range循环中如何评估表达式(#31)4.3忽略在range中使用指针元素的影响(#32)4.4对map遍历的错误假设(#33)4.5忽略break的作用(#34)4.6在循环中使用defer(#35)5.字符串5.1不理解rune的概念(#36)5.2不准确的字......
  • 生成随机字符串(数字、字母、特殊符号组合)
    多用于随机复杂密码。如果“数字、字母、特殊符号”都放在一个数组中,随机生成的不一定会同时具备三者的组合,所以,只能分开,再自定义规则组合在一起(虽然不是很完美)以下便是实例,调用的时候加上“密码长度(不少于6位)”的判断提示!///<summary>///生成随机密码///</summary>/......
  • Java与sql中的字符串表示
    在Java中,双引号""用于表示字符串字面量,而单引号''用于表示字符字面量。这意味着在Java中,您可以使用双引号来包围包含任意数量字符的字符串,包括零个字符(空字符串)和多个字符。例如,在Java中:StringemptyString="";//空字符串StringsingleChar='a';/......
  • 楼房重建线段树
    维护前缀最大值个数。对pushup操作进行修改。定义solve(x,lim)为前面这个区间的最大值为lim,\(x\)支配的区间产生的贡献。如果\(x\)的最大值已经小于\(lim\),显然没有贡献。考虑\(x\)的左儿子,如果左儿子的最大值大于\(lim\)直接递归左二子查询,此时右儿子的答案不......
  • P6025 线段树 题解
    解题思路暴力做法从\(l\)到\(r\)枚举每一个数,然后建线段树,记录最大下标,然后计算答案。代码略。时间\(O(n^2)\),期望得分:\(10\)分。优化暴力我们考虑每次枚举不遍历整棵线段树。显然,贪心的,最深的最右边的节点编号最大。那么我们可以发现,如果两颗子树大小相同,那么最大节......
  • PowerShell 的 Get-FileHash 命令查询一个文件的所有上述哈希值(假设是 SHA256, MD5, S
    PowerShell是一种跨平台的任务自动化解决方案,包含一个命令行外壳、脚本语言和配置管理框架。PowerShell提供了用于计算文件哈希值的内置命令Get-FileHash。Get-FileHash命令可以用来计算文件的哈希值,支持多种哈希算法。,Get-FileHash支持以下几种哈希算法:SHA256:默认算法,提......
  • 字符串hash
    记录23:402024-2-51.字符串hash将字符串转换为hash值。以p=131/13331,将字符串看成P进制数,取一固定值M,求出该P进制数对M的余数,作为该字符的hash值。可以取M=\(2^{64}\)用unsignedlonglong存储这个hash值,这样不用取模,因为如果溢出了就相当于对\(2^{64}\)取模了除了在......
  • ORACLE_查询blob字段中是否包含某个字符串/blob字段模糊匹配
    要查询一个BLOB字段中是否包含某个字符串,可以使用Oracle的DBMS_LOB.INSTR函数。示例如下,这里我们有2条记录,每条blob字段都有数据;其中第二条blob字段包含有字符串“T_NT_EndorsementBillEntry”,第一条记录没有正常我们如下查询会报错:对这个blob截取也会报这个错,这里我......