N - Subpalindromes URAL - 1989 哈希+线段树
N - Subpalindromes
这个是一个哈希+线段树,这个题目也不算特别难,但是呢,还比较有意思。
这个题目给你两个操作,一个是回答l~r 区间是不是回文,一个是对一个点进行单点修改。
这个用哈希还是比较好用的,首先就是把所有字符映射成一个数字,然后就相当于给你一串数字进行以上操作。
这个最好就是从小到大进行一个递增的哈希,这个看代码吧,说不太清楚。
主要注意一点就是最后要保证这个哈希的位数是一样的,具体看代码。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<cmath>
#include<sstream>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e5 + ;
const ull base = ;
ull h[maxn], p[maxn];
ull sum1[maxn * ], sum2[maxn * ];
int n, m;
char str1[maxn], str2[maxn]; void push_up(int id) {
sum1[id] = sum1[id << ] + sum1[id << | ];
sum2[id] = sum2[id << ] + sum2[id << | ];
//printf("sum[%d]=%llu nisum[%d]=%llu\n", id, sum[id], id, nisum[id]);
} void build(int id, int l, int r) {
if (l == r) {
sum1[id] = (str1[l] - 'a' + )*p[l];//哈希赋值,从小往大,递增赋值
sum2[id] = (str2[l] - 'a' + )*p[l];
return;
}
int mid = (l + r) >> ;
build(id << , l, mid);
build(id << | , mid + , r);
push_up(id);
} void update(int id, int l, int r, int pos, int val, int f) {
if (l == r) {
if (f == ) sum1[id] = val * p[l];
else sum2[id] = val * p[l];
return;
}
int mid = (l + r) >> ;
if (pos <= mid) update(id << , l, mid, pos, val, f);
else update(id << | , mid + , r, pos, val, f);
push_up(id);
} ull query(int id, int l, int r, int x, int y, int f) {
if (x <= l && y >= r) {
if (f == ) return sum1[id];
return sum2[id];
}
int mid = (l + r) >> ;
ull ans = ;
if (x <= mid) ans += query(id << , l, mid, x, y, f);
if (y > mid) ans += query(id << | , mid + , r, x, y, f);
return ans;
} char s[maxn], ch[]; int main() {
scanf("%s", str1 + );
n = strlen(str1 + );
p[] = ;
for (int i = ; i <= n; i++) p[i] = p[i - ] * base, str2[i] = str1[n + - i];
build(, , n);
scanf("%d", &m);
while (m--) {
int x, y;
scanf("%s", s);
if (s[] == 'p') {
scanf("%d%d", &x, &y);
ull rest1 = query(, , n, x, y, );//这样子查询还是有点难想的
ull rest2 = query(, , n, n + - y, n + - x, );
if (x < n + - y) rest1 *= p[n + - x - y];//这个if是保证这两个rest的数量级是一样的,这个可以画一个x轴就知道了
else rest2 *= p[x + y - n - ]; if (rest1 == rest2) printf("Yes\n");
else printf("No\n");
}
else {
scanf("%d%s", &x, ch);
update(, , n, x, ch[] - 'a' + , );
update(, , n, n - x + , ch[] - 'a' + , );
}
}
}
哈希
N - Subpalindromes URAL - 1989 哈希+线段树的更多相关文章
- 51Nod1553 周期串查询 字符串 哈希 线段树
原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1553.html 题目传送门 - 51Nod1553 题意 有一个串只包含数字字符.串的长度为n,下标 ...
- URAL 1297 后缀数组+线段树
思路: 论文题--*n 倒过来接上 分奇偶讨论 求LCP 搞棵线段树即可 //By SiriusRen #include <cstdio> #include <cstring> ...
- 线段树详解 (原理,实现与应用)(转载自:http://blog.csdn.net/zearot/article/details/48299459)
原文地址:http://blog.csdn.net/zearot/article/details/48299459(如有侵权,请联系博主,立即删除.) 线段树详解 By 岩之痕 目录: 一:综述 ...
- 【URAL 1989】 Subpalindromes(线段树维护哈希)
Description You have a string and queries of two types: replace i'th character of the string by char ...
- URAL 1989 Subpalindromes (多项式hash) +【线段树】
<题目链接> <转载于 >>> > 题目大意:给你一段字符串,进行两种操作:1.询问[l,r]这个区间中的字符串是否是回文串: 2.更改该字符串中对应下标的 ...
- 线段树+哈希【CF580E】Kefa and Watch
线段树+哈希[CF580E]Kefa and Watch Description \(n\)个数的字符串,\(m + k\)个操作 1 l r k把\(l - r\)赋值为\(k\) 2 l r d询 ...
- [bzoj2124]等差子序列——线段树+字符串哈希
题目大意 给一个1到N的排列\(A_i\),询问是否存在\(p_i\),\(i>=3\),使得\(A_{p_1}, A_{p_2}, ... ,A_{p_len}\)是一个等差序列. 题解 显然 ...
- CF213E Two Permutations 线段树维护哈希值
当初竟然看成子串了$qwq$,不过老师的$ppt$也错了$qwq$ 由于子序列一定是的排列,所以考虑插入$1$到$m$到$n-m+1$到$n$; 如何判断呢?可以用哈希$qwq$: 我们用线段树维护哈 ...
- HDU3973 线段树 + 字符哈希
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3973 , 线段树 + 字符哈希,好题. 又学了一种新的哈希方法,hhhh~ 解法: 想法是用P进制的数 ...
随机推荐
- File类心得
File类心得 在程序中设置路径时会有系统依赖的问题,java.io.File类提供一个抽象的.与系统独立的路径表示.给它一个路径字符串,它会将其转换为与系统无关的抽象路径表示,这个路径可以指向一个文 ...
- Centos7_搭建暗网网站
Tor运行原理 请求方需要使用:洋葱浏览器(Tor Browser)来对暗网网站进行访问 响应放需要使用:Tor协议的的Hidden_service 搭建步骤 更新YUM源: rpm -Uvh htt ...
- openssl进行RSA加解密(C++)
密钥对根据RSA的加密机制(自行查找RSA工作原理),通常可以私钥加密-公钥解密(多用于签名),公钥加密-私钥解密(多用于数据传输加密),私钥可以生成公钥. 密钥对生成生成私钥,长度为2048,默认格 ...
- 【论文笔记】YOLOv4: Optimal Speed and Accuracy of Object Detection
论文地址:https://arxiv.org/abs/2004.10934v1 github地址:https://github.com/AlexeyAB/darknet 摘要: 有很多特征可以提高卷积 ...
- iview使用之怎样给Page组件添加跳转按钮
在项目开发过程中,我们会经常遇到使用分页的表格,然而在ivieiw中,我们通常只能使用Page组件自带的功能,如下图: 切换每页条数这些基本的功能都不说了,有时候我们需要在输入框里输入想要跳转到的页数 ...
- 15分钟从零开始搭建支持10w+用户的生产环境(三)
上一篇文章介绍了这个架构中,选择MongoDB做为数据库的原因,及相关的安装操作. 原文地址:15分钟从零开始搭建支持10w+用户的生产环境(二) 三.WebServer 在SOA和gRPC大行其 ...
- WebApi参数检查验证FluentValidation的使用方法
右键打开NuGet程序包管理,进入浏览,搜索 FluentValidation,点击下载 在Model文件夹添加一个Person类进行校验 校验前,using需要引入相应的命名空间方可使用,Abstr ...
- synchronized 的实现原理
加不加 synchronized 有什么区别? synchronized 作为悲观锁,锁住了什么? synchronized 代码块怎么用 前面 3 篇文章讲了 synchronized 的同步方法和 ...
- 2019-2020-1 20199303《Linux内核原理与分析》第七周作业
进程的描述 1.进程概念 进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位.进程由程序段.数据段.PCB组成 2.PCB中的信息 ①进程标识符 ②处理机状态 ③进程调度信息 ④进程控制 ...
- 关于搭建IIS网页弹出登录框的解决方案
今天自己搭建IIS服务器的时候,明明设置了匿名访问,但是用ie访问127.0.0.1的时候还是会弹出一个登陆框,最后在网上找到答案. 转自: https://blog.csdn.net/sunleib ...