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进制的数 ...
随机推荐
- Volatile可见性分析(一)
JUC(java.util.concurrent) 进程和线程 进程:后台运行的程序(我们打开的一个软件,就是进程) 线程:轻量级的进程,并且一个进程包含多个线程(同在一个软件内,同时运行窗口,就是线 ...
- AJ学IOS(49)多线程网络之线程的创建NSThreand
AJ分享,必须精品 一:NSThread的基本使用 1:创建和启动线程 一个NSThread对象就代表一条线程 创建.启动线程 NSThread *thread = [[NSThread alloc] ...
- AJ学IOS(12)UI之UITableView学习(上)LOL英雄联盟练习
AJ分享,必须精品 先看效果图 源代码 NYViewController的代码 #import "NYViewController.h" #import "NYHero. ...
- kworkerds 挖矿木马简单分析及清理
公司之前的开发和测试环境是在腾讯云上,部分服务器中过一次挖矿木马 kworkerds,本文为我当时分析和清理木马的记录,希望能对大家有所帮助. 现象 top 命令查看,显示 CPU 占用 100%,进 ...
- sprint3总结 && sprint4计划
sprint3总结 在一周时间里,逻辑部分顺利的将数据库,查词,UI部分连接到一起.并且各部分也针对新的要求做出了一些修改,目前数据库和查词alpha版已经完成,UI部分还需要一些美化,逻辑部分也还需 ...
- 掷骰子 dp
B. 掷骰子 单点时限: 2.0 sec 内存限制: 512 MB 骰子,中国传统民间娱乐用来投掷的博具,早在战国时期就已经被发明. 现在给你 n 个骰子,求 n 个骰子掷出点数之和为 a 的概率是多 ...
- python selenium模块 css定位
selenium是python的非标准库,使用时需要下载安装 安装命令 pip install selenium selenium是python的自动化测试模块,可以模拟浏览器的行为 所以在使用之前 ...
- Chrome 浏览器安装 ChroPath 插件
1.下载地址 http://www.cnplugins.com/devtool/chropath/download.html 2.安装方法 a.把下载的文件更改后缀名变为压缩包,然后解压到本地:如下图 ...
- 分享一个404页面(猴子动态SVG图)
说明 在CSDN看到的一个404界面,简洁大气非常棒我的个人网站已经用上了! 代码 防止原页面失效,代码 粘贴在下面 <!DOCTYPE html> <html lang=" ...
- Springboot整合https原来这么简单
1 简介 HTTP是不安全的,我们需要给它套上SSL,让它变成HTTPS.本文章将用实例介绍Springboot整合HTTPS. 2 密码学基础 要谈https就要谈Security,自然就要谈安全: ...