URAL 1989 Subpalindromes(线段树单点修改+字符串hash)

stc8g1k08硬件iic读取aht20温湿度及0.91寸oled显示 使用stc8g1k08读取aht20温湿度及0.91寸oled显示。 阅读详情

题意:

给出一个字符串,长度为105,有m个操作m<=104。
有两种操作:
1. 询问[l,r]区间的子串是否回文
2. 将第i个字符改为c。

解析:

用字符串哈希+线段树来做这题,线段树用于查询区间的hash值。
建两棵线段树一棵维护从前向后的hash值,另外一棵维护从后向前的hash值。
那么我们判断是否回文串,就只要看正反区间的哈希值之和是否相等就行了。
至于修改就是单点更新了。

my code

#include <cstdio>
#include <cstring>
#include <algorithm>
#define ls (o<<1)
#define rs (o<<1|1)
#define lson ls, L, M
#define rson rs, M+1, R
using namespace std;
typedef unsigned long long ll;
const int N = (int)1e5 + 10;
const int sigma_size = 33;

int n, m;
ll H[N];
char str[N], str2[N];

inline ll idx(char c) { return c - 'a' + 1; }
inline int get(int pos) { return n - pos + 1; }

void init() {
    H[0] = 1;
    for(int i = 1; i < N; i++) {
        H[i] = H[i-1] * sigma_size; 
    }
}

ll lsum[N<<2], rsum[N<<2];
void pushUp(int o, int L, int R) {
    int M = (L + R)/2;
    lsum[o] = H[R - M] * lsum[ls] + lsum[rs];
    rsum[o] = H[R - M] * rsum[ls] + rsum[rs];
}

void build(int o, int L, int R) {
    if(L == R) {
        lsum[o] = idx(str[L]);
        rsum[o] = idx(str2[L]);
        return ;
    }
    int M = (L + R) >> 1;
    build(lson);
    build(rson);
    pushUp(o, L, R);
}

void modify(int o, int L, int R, int pos, int op) {
    if(L == R) {
        if(op == -1) lsum[o] = idx(str[L]);
        else rsum[o] = idx(str2[L]);
        return ;
    }
    int M = (L + R) >> 1;
    if(pos <= M) modify(lson, pos, op);
    else modify(rson, pos, op);
    pushUp(o, L, R);
}

ll query(int o, int L, int R, int ql, int qr, int op) {
    if(ql <= L && R <= qr)
        return (op == -1) ? lsum[o] : rsum[o];
    int M = (L + R) >> 1;
    if(qr <= M) return query(lson, ql, qr, op);
    else if(ql > M) return query(rson, ql, qr, op);
    return query(lson, ql, M, op) * H[qr - M] + query(rson, M+1, qr, op);
}

int main() {
    char oper[20], c[5];
    int a, b;

    init();
    while(~scanf("%s", str+1)) {
        n = strlen(str+1);
        strcpy(str2+1, str+1);
        reverse(str2+1, str2+1+n);

        build(1, 1, n); 
        scanf("%d", &m);

        ll pre, suf;
        while(m--) {
            scanf("%s", oper);
            if(oper[0] == 'p') {
                scanf("%d%d", &a, &b);
                int mid = (a + b) >> 1;
                int flag = (a + b) & 1;
                pre = query(1, 1, n, a, mid, -1);
                suf = query(1, 1, n, get(b), get(mid+flag), 1);
                puts((pre == suf) ? "Yes" : "No");
            }else {
                scanf("%d%s", &a, c);
                str[a] = c[0];
                modify(1, 1, n, a, -1);

                str2[get(a)] = c[0];
                modify(1, 1, n, get(a), 1);
            }
        }
    }
    return 0;
}
发那科机器人Modbus通讯配置全攻略:从IP设置到信号调试 本文详细介绍了发那科机器人Modbus通讯的配置方法,从基础认知到IP设置、端口配置、信号调试及故障排查。重点讲解了UOP和DI/DO信号的配置技巧,帮助工程师快速实现机器人与PLC的稳定通讯,提升自动化系统效率。 阅读详情

相关推荐

Latex在VSCODE中编译报错`Recipe terminated with error. Retry building the project.

Latex在VSCODE中编译报错Recipe terminated with error. Retry building the project. 1 报错提示: Recipe terminated with error 2 报错原因 大概率的原因是因为latex没有添加到系统环境变量中,所有设置的编译工具没有办法找到才出现的这种情况 3 解决方案 请按照如下方式进行系统变量的添加 对windows,win+R 然后输入sysdm.cpl 在高级中选择环境变量 找到path环境变量,将txtlive中

呆呆象呆呆的博客 3万+

szu 寒训个人复习第一天 线段树入门单点修改,区间修改,以及线段树的扩展运用[线段树+dp][区间最大公约数]

寒讯内容有点过多(其实是我太菜了) 水一波怕忘了(人老了) **什么是线段树** 线段树是本蒟蒻感觉用处特别大的算法 那么线段树上面的节点表示什么意思呢? 线段树,上面的节点表示一个区间,父亲节点表示的区间是左右儿子相加. 同一...

weixin_45630722的博客 1709

【树莓派4B】八、树莓派软路由,Ubuntu18.04配置路由转发

我的目的是通过把树莓派做成一个软路由,相当于一个智能路由器。 材料 树莓派4B,操作系统其实可以是其他的Linux版本。以为4B自带无线网卡,就用自带无线网卡作为路由出口。 大概思路 具体步骤 配置两个网卡的IP sudo vim /etc/network/interface 这里设置静态IP,也可以动态获取。 #Local loopback auto lo iface lo inet loopback #Ethernet0 auto eth0 iface eth0 inet static addr

林愿留的博客 10万+

Subpalindromes

题目:Subpalindromes 总结:这题用到的是线段树+hash,给五个元素 a, b, c,d,e.利用hash判断它们是否有回文串,假定一个元素为k 假如我们要判断a,b,c是否是回文串,那么只要在k^ 0,k ^ 1,k ^ 2同时乘k ^ 2 就可以判断了,所以需要两个线段树,叶子节点保存的如上图所示, 仔细看一下程序就懂了 #include <stdio.h> #...

多一些不为什么的坚持 588

华为AR6140E/S5735设备密码策略配置全攻略:从复杂度到锁定机制

本文详细介绍了华为AR6140E/S5735设备的密码策略配置方法,涵盖密码复杂度、时效性和防护性三大核心维度。通过具体的CLI命令示例,指导管理员如何设置密码长度、字符组合、有效期及登录失败锁定等安全机制,为企业网络提供全面的用户名密码防护策略。

weixin_30836759的博客 531

Robocopy 参数进阶:/MIR 镜像同步与 /PURGE 删除操作的风险规避指南

本文深入解析Robocopy的/MIR镜像同步与/PURGE删除操作的高级用法及风险规避策略。通过实际案例和四重防护机制,指导用户安全实现目录同步,避免数据丢失风险,特别适用于远程主机间的数据复制与备份场景。

weixin_33462927的博客 357

Subpalindromes 哈希+树状数组

You have a string and queries of two types: replace i’th character of the string by character a; check if substring sj...sk is a palindrome. Input The first line contains a string consisting of n ...

Top_Spirit的博客 297

Unity基础篇-----Input输入

2、Input.GetTouch()方法,主要用于移动端开发使用,此方法主要获取触摸屏幕的操作数据,首先通过Input.touchCount这个方法获取到手指触摸屏幕的次数,通过GetTouch方法传输触摸次数,调用Touch结构判断手指的状态来是否为设定的状态,符合的话则执行相关内容。参数(“Horizontal”)表示左右的值,值为-1时,表示你在一直按下左方向对应的按键、设备类型为手柄时,表示你把推杆推到了最左边,为0时为默认位置,手柄中对应正中间,为1时与-1时对应的情况正好相反。

why820mmm的博客 3495

URAL 1989 Subpalindromes(哈希+线段树)

题意:给你一个字符串,再给出两种操作,一种是给出一个区间判断这个区间是不是回文串,一种是将字符串的某个字符改成另一个。思路:一开始看到给出的时间只有500ms就蒙了,然后就去翻了下博客,说一下自己解题过程中遇到的疑惑。1.这题的哈希多项式公式好奇怪,和之前所做的题的多项式不一样。之前的多项式是字符串的幂次方随着字符串增长而递减的,这题却是递增的。 (这题的公式:h[i]=s[1]+s[2]*p+s

yiqzq的博客 551

时序SDC约束set_data_check及常见应用场景

时序约束SDC之set_data_check命令及常见应用场景解析

weixin_37584728的博客 2288

Windows部署OpenClaw报错不断?这篇环境配置指南帮你解决难题

想在Windows上部署OpenClaw却频频报错?🔧 本文详细梳理了OpenClaw部署必需环境的安装步骤和官方下载地址 📦,提供完整的验证清单和常见问题排查方法,帮你一次性搞定所有环境配置,顺利部署OpenClaw ✅

XiaoqiangClub的博客 6652

URAL 1989 Subpalindromes(字符串HASH&线段树单点更新)

题意:给你长度为N的字符串,有M个操作,操作有两种类型(1)“change i a”,表示将第i个字符变成a,(2)“palindrome? j k”,询问[j,k]的字符串是否构成回文串。 从0到N-1HASH一次,到从N-1到0HAsH一次,判断的话,直接判断两次HASH后的结果是否相同,保险相见,用了双HASH。 #include #include #include using

4075

事件驱动的 SAP 工作流:从 BOR 事件到 Event Linkage 的落地与排障全景图

摘要: SAP工作流中的Event是业务对象状态变化的系统广播机制,如发票录入、采购订单释放等事件。通过事件驱动,业务程序与流程引擎解耦,业务只需发布事件,流程引擎负责后续处理。文章详细解析了SAP工作流事件的完整链路,包括事件定义、触发机制、事件容器传递、SWE2配置的关键作用,以及事件不触发时的排查方法。重点介绍了事件在启动流程、终止任务、等待步骤和主动创建中的应用,并结合采购订单审批案例说明事件的实际使用场景和配置要点。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 190

URAL 1989. Subpalindromes

给定一个字符串,有两个操作。1:改变某个字符。 2:判断某个区间

岩之痕 4853

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【线段树 + 哈希字符串匹配】URAL 1989. Subpalindromes

URAL 1989. Subpalindromes 题意:对一个字符串有两个操作:(1)查询区间[l, r]子串是不是回文串. (2)修改某个位置上的字符 思路:这个有点显然是线段树,但问题就是我们应该用线段树维护什么? 我们用线段树维护的当然是两个值:Lval(正串的哈希值),Rval(反串的哈希值)。那么问题又来了,是整个串的哈希值还是区间子串的哈希值呢? 这里我用的是整个串的哈希值,区...

L_X_ 507

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

URAL 1989 Subpalindromes 线段树+哈希

给出n≤1e5n\leq1e5n≤1e5的字符串,支持单点修改,判断区间是否为回文串。 基本上是哈希的模板题吧。用线段树维护正反两个哈希,然后直接修改和查询。 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; const int inf=0...

qq_40859782的博客 162

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

URAL - 1989 Subpalindromes 线段树哈希

题目链接:点击查看 题意:给一个串,两种操作,一个数查询区间是否为回文串,另一个是更改某一位置 的字符。 题解:哈希,hash[i] = hash[i-1] * p,p我们可以设为27,剩下的就是直接区间合并即可,原以为思路不对,打了20分钟表,终于找到哪里错了,要注意的是几个数相乘,结果溢出,乘的循序不同,结果是相同的。 两种写法,一、直接确定一个区间的是多少,二每个位置都根据首部确定...

还我笑颜 239

URAL 1989 Subpalindromes(多项式哈希+线段树)

URAL 1989 Subpalindromes(多项式哈希+线段树) 题意:给出一个字符串,长度为10^5,有m个操作m 解题思路:用多项式哈希,那么我们判断是否回文串,就只要看正反区间的哈希值之和是否相等了,也就是线段树区间求和,那么修改就是单点更新了。 #include #include #include #define lson l , m , rt << 1 #define r

No__stop 1849

URAL 1989 Subpalindromes

原题戳Time limit: 0.5 second Memory limit: 64 MBDescription You have a string and queries of two types: replace i’th character of the string by character a; check if substring sj…sk is a palindro

Harrys_Snitch 606

URAL - 1989 Subpalindromes (单点修改,查询某个区间子串是否为回文串) (线段树+哈希)

链接 You have a string and queries of two types: replace i’th character of the string by character a; check if substring sj…sk is a palindrome. Input The first line contains a string consisting of ...

henuzxy 802

URAL - 1989 Subpalindromes(字符串哈希+ 树状数组 or 线段树)

题目链接 题意 输入一个1e5的串a,1e5次询问 每次询问: palindrome? l r 询问[l,r][l ,r][l,r]的子串是否是回文串 change x c 把a[x]改成c 下标从1开始 解法 显然, 若一个串与它反转后的串相同,这个串就是回文串(废话 ) 这里要用到多项式哈希, 将原串和反转后的串的每个字符哈希,用树状数组维护 多项式哈希 把字符串的第iii个字符哈希:h[i]...

Apale_8的博客 400

A - Subpalindromes URAL - 1989 (线段树)

一个字符串可以表示为:,故当哈希冲突率低的时候,可以将字符串唯一表示为一个数字,本题线段树就是维护区间和。 #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<iostream> #include<queue> #...

cy41的博客 223

Subpalindromes URAL - 1989 (字符串hash+线段树)

题目链接 题意:给定一个小写字母组成的字符串,m次操作,每次修改单个位置的字符或者查询[l,r]这段子串是否是回文串,给出Yes/No 思路:输入字符串s0,设字符串的逆序串为s1。 如果这题没有单点修改的话,直接对s0 s1求出hash数组,然后对于[l,r]判断左边区间的hash值是否等于右半区间的hash值 。 但是涉及单点修改的话,就需要线段树维护区间hash值。 而且需要两棵线段树对s0 s1分别维护。 hash的区间合并: 另外还有一些细节,比如查询时的写法(返回结构体) 见代码注释 #inc

矮纸斜行闲作草 227

Subpalindromes URAL - 1989(树状数组+哈希)

You have a string and queries of two types: replace i’th character of the string by character a; check if substring sj…sk is a palindrome. Input The first line contains a string consisting of n small ...

Gee_Zer的博客 304

URAL - 1989 Subpalindromes【线段树+hash】

You have a string and queries of two types: replace i’th character of the string by character a; check if substring sj…sk is a palindrome. Input The first line contains a string consisting of n small ...

slass-mot-odet 374

Subpalindromes 【URAL - 1989】【线段树+哈希hash】

题目链接 一道线段树单点更新加上哈希的简单题。。。 完整代码: #include &lt;iostream&gt; #include &lt;cstdio&gt; #include &lt;cmath&gt; #include &lt;string&gt; #include &lt;cstring&gt; #include &lt;algorithm&gt; #include &lt;li...

既然弱小,就只顾变强就是了 340
上一篇: CodeForces 276E Little Girl and Problem on Trees(线段树区间更新)
下一篇: hdu 5417 Victor and Machine(模拟)
HelloWorld10086
博客等级 码龄12年 88粉丝 614原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值