首页 > 其他分享 >字符串选讲

字符串选讲

时间:2024-07-19 22:17:59浏览次数:8  
标签:int updata LL 选讲 cs 字符串 using mod

树状数组维护区间哈希值

重点, 区间长度 = \(lowbit(x)\)

#include<bits/stdc++.h>

using namespace std;

using int128 = __int128;

using LL = long long;

const int N = 1e6 + 6;

LL c[4][N], sum, bpow[N], b = 100591, mod = 1e18 + 31, u;
int n, q, op, l, r, x;
char cs;
string s;

int lowbit(int x){
  return x & -x;
}

void updata(int id, int x, LL k){
  for(u = x; x <= n; c[id][x] = ((c[id][x] + (int128)(k) * bpow[x - u] % mod) % mod + mod) % mod, x += lowbit(x)){
  }
}

LL getsum(int id, int x){
  for(sum = 0, u = 1; x; sum = ((sum + (int128)(c[id][x]) * u % mod) % mod + mod) % mod, u = (int128)(u) * bpow[lowbit(x)] % mod, x -= lowbit(x)){
  }
  return sum;
}

LL query(int id, int l, int r){
  return (getsum(id, r) - (int128)(getsum(id, l - 1)) * bpow[r - l + 1] % mod + mod) % mod;
}

int main(){
  cin >> n >> q >> s;
  s = ' ' + s;
  bpow[0] = 1;
  for(int i = 1; i <= n; ++i){
    bpow[i] = (int128)(bpow[i - 1]) * b % mod;
  }
  for(int i = 1; i <= n; ++i){
    updata(0, i, s[i] - 'a' + 1);
    updata(1, i, s[n - i + 1] - 'a' + 1);
  }
  while(q--){
    cin >> op;
    if(op == 1){
      cin >> x >> cs;
      updata(0, x, (-(s[x] - 'a' + 1) + mod) % mod);
      updata(1, n - x + 1, (-(s[x] - 'a' + 1) + mod) % mod);
      s[x] = cs;
      updata(0, x, (s[x] - 'a' + 1));
      updata(1, n - x + 1, (s[x] - 'a' + 1));
    }
    else{
      cin >> l >> r;
      cout << (query(0, l, r) == query(1, n - r + 1, n - l + 1) ? "Yes\n" : "No\n");
    }
  }
  return 0;
}

失配树

每个元素 KMPnxt 就是这个元素的父亲节点, 这样, 每个节点的祖先都是它的前缀

标签:int,updata,LL,选讲,cs,字符串,using,mod
From: https://www.cnblogs.com/liuyichen0401/p/18312473

相关文章

  • (nice!!!)LeetCode 3085. 成为 K 特殊字符串需要删除的最少字符数(贪心、哈希表、字符串)
    3085.成为K特殊字符串需要删除的最少字符数思路:1、用哈希表mp先统计出字符串word中所有字母出现的次数2、将哈希表里的次数进行升序排序v3、采用贪心的策略,删除最少的字符串,就是保留最大的字符串。可知,最少有一个元素的数量不需要改变。那么我们就枚举这个数量v[i],......
  • 字符串哈希
    #include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;typedefunsignedlonglongull;typedefdoubledb;typedeflongdoubleldb;typedefpair<int,int>pii;typedefpair<ll,ll>PII;#definepbemplace_back//#defineint......
  • Redis系列命令更新--Redis字符串命令
    1、RedisSET命令 (1)说明:用于设置给定key的值;如果key已经存储其他值,SET就覆写旧值,且无视类型;(2)语法:redis127.0.0.1:6379>SETKEY_NAMEVALUE(3)实例:#对不存在的键进行设置redis127.0.0.1:6379>SETkey"value"OKredis127.0.0.1:6379>GETkey"value"#对已存在的键......
  • 算法刷题笔记 字符串哈希(C++实现)
    文章目录题目描述基本思路实现代码题目描述给定一个长度为n的字符串,再给定m个询问,每个询问包含四个整数l1,r1,l2,r2,请你判断[l1,r1]和[l2,r2]这两个区间所包含的字符串子串是否完全相同。字符串中只包含大小写英文字母和数字。输入格式第一行包含整数n和m,表示字符......
  • JSON 格式的字符串反序列化为 .NET 对象
    DeserializeObject是Newtonsoft.Json(通常简称为Json.NET)库中的一个方法,用于将JSON格式的字符串反序列化为.NET对象。这个方法允许你将JSON数据转换成C#中的类实例,使得你可以方便地在程序中操作这些数据。使用方法要使用DeserializeObject方法,你首先需要安装Newton......
  • 蓝桥杯省赛 垂直柱状图(字符串+模拟)
    描述写一个程序从输入文件中去读取四行大写字母(全都是大写的,每行不超过 100 个字符),然后用柱状图输出每个字符在输入文件中出现的次数。严格地按照输出样例来安排你的输出格式。输入描述四行字符,由大写字母组成,每行不超过 100 个字符。输出描述由若干行组成,前几行由空......
  • 字符串回文
    \(Manacher\)(马拉车)作用:可以在线性复杂度下求出每个点的最长回文半径算法流程:step1.\(manacher\)只能解决有对称中心的回文串,因此需要将所有回文串转化为有对称中心的,具体操作就是在每两个字符之间插入一个无关字符,并在首尾都插入无关字符step2.从左到右依次处理,记......
  • Java开发手册中-要求日志输出时字符串变量之间的拼接使用占位符与使用字符串拼接性能
    场景Java中使用JMH(JavaMicrobenchmarkHarness微基准测试框架)进行性能测试和优化:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/131723751参考以上性能测试工具的使用。Java开发手册中有这样一条:【强制】在日志输出时,字符串变量之间的拼接使用占位符的方式......
  • Leetcoede编程基础0到1——1768. 交替合并字符串& 389. 找不同
    1768.交替合并字符串题目描述:给你两个字符串 word1 和 word2 。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。返回 合并后的字符串 。输入输出实例:  示例1:输入:word1="ab......
  • Excel系列---【如何给一列字符串,在首尾快速加上双引号】
    你可以按照以下步骤将这个公式从A1应用到A164,并将结果生成到C1到C164:例如A1的内容为hello,在C1单元格中输入以下公式:=""""&A1&""","按下回车键后,C1单元格会显示A1单元格内容的修改结果,结果为"hello",。选中C1单元格,然后将鼠标放在单元格右下角的小黑点上,当鼠标变成十字形时,按......