<题目链接>

<转载于 >>>  >

题目大意:
给你一段字符串,进行两种操作:
1.询问[l,r]这个区间中的字符串是否是回文串;

2.更改该字符串中对应下标的字符。

解题分析:

快速判断字符串是不是回文串,可以用到多项式Hash。假设一个串s,那么字串s[i, j]的Hash值就是H[i, j]=s[i]+s[i+1]*x+s[i+2]*(x^2)+...+s[j]*(x^(j-i))。由于只有小写字母,因此x取27。但是H[i, j]这会很大,我们取模就可了,可以把变量类型设为unsigned long long, 那么自动溢出就相当于模2^64了。对于不同串但是Hash相同的情况,这种情况的概率是非常小的,通常可以忽略,当然我们也可以对x取多次值,求出不同情况下的Hash值。然后我们就可以用线段树或者树状数组来维护这个和了,复杂度O(nlogn)。

 #include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; #define Lson rt<<1,l,mid
#define Rson rt<<1|1,mid+1,r
#define N 100005
#define ull unsigned long long
ull f[N];
char s[N];
int n;
struct Tree{
ull lsum,rsum; //左->右和右->左的hash值
}tr[N<<];
void Pushup(int rt){ //将该区间内从左到右和从右到左的多项式hash的每一位相加
tr[rt].lsum=tr[rt<<].lsum+tr[rt<<|].lsum;
tr[rt].rsum=tr[rt<<].rsum+tr[rt<<|].rsum;
}
void build(int rt,int l,int r){
if(l==r){
tr[rt].lsum=f[l-]*(s[l-]-'a'); //得到hash多项式相应位置的hash值
tr[rt].rsum=f[n-l]*(s[l-]-'a');
return;
}
int mid=(l+r)>>;
build(Lson);
build(Rson);
Pushup(rt);
}
void update(int rt,int l,int r,int pos,int num){
if(l==r){
tr[rt].lsum=f[l-]*num;
tr[rt].rsum=f[n-l]*num;
return;
}
int mid=(l+r)>>;
if(pos<=mid)update(Lson,pos,num);
if(pos>mid)update(Rson,pos,num);
Pushup(rt);
}
ull lsum,rsum;
void query(int rt,int l,int r,int L,int R){
if(L<=l&&r<=R){
lsum+=tr[rt].lsum;
rsum+=tr[rt].rsum;
return;
}
int mid=(l+r)>>;
if(L<=mid)query(Lson,L,R);
if(R>mid)query(Rson,L,R);
}
int main(){
f[]=;
for(int i=;i<N;i++)
f[i]=f[i-]*; //预处理27的1~N次方
while(scanf("%s",s)!=EOF){
n=strlen(s);
build(,,n);
int q;scanf("%d",&q);
while(q--){
scanf("%s",s);
if(s[]=='p'){
int x,y;scanf("%d%d",&x,&y);
lsum=rsum=;
query(,,n,x,y);
int k1=x-;
int k2=n-y;
if(k1>k2)rsum*=f[k1-k2]; //按照上面的计算方式,从左向右和从右向左的相同hash多项式的计算中,短区域中的每一项会比长区域少乘f[k1-k2](或f[k2-k1])次方,所以这里要讲相差的f[]乘上,再进行比较
else lsum*=f[k2-k1];
if(lsum==rsum)printf("Yes\n");
else printf("No\n");
}
else{
int x;
scanf("%d%s",&x,s);
update(,,n,x,s[]-'a');
}
}
}
}

2018-10-31

URAL 1989 Subpalindromes (多项式hash) +【线段树】的更多相关文章

  1. bzoj2124 等差子序列(hash+线段树)

    2124: 等差子序列 Time Limit: 3 Sec  Memory Limit: 259 MBSubmit: 719  Solved: 261[Submit][Status][Discuss] ...

  2. URAL-1989 Subpalindromes 多项式Hash+树状数组

    题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1989 题意:给出一个字符串,m个操作:1,修改其中一个字符串,2,询问 [a, b] 是 ...

  3. URAL 1890 . Money out of Thin Air (dfs序hash + 线段树)

    题目链接: URAL 1890 . Money out of Thin Air 题目描述: 给出一个公司里面上司和下级的附属关系,还有每一个人的工资,然后有两种询问: 1:employee x y z ...

  4. HDU - 3973 AC's String(Hash+线段树)

    http://acm.hdu.edu.cn/showproblem.php?pid=3973 题意 给一个词典和一个主串.有两种操作,查询主串某个区间,问这主串区间中包含多少词典中的词语.修改主串某一 ...

  5. 【10.6校内测试】【小模拟】【hash+线段树维护覆盖序列】

    一开始看到题就果断跳到T2了!!没想到T2才是个大坑,浪费了两个小时QAQ!! 就是一道小模拟,它怎么说就怎么走就好了! 为什么要用这么多感叹号!!因为统计答案要边走边统计!!如果每个数据都扫一遍20 ...

  6. ural 1707. Hypnotoad's Secret(线段树)

    题目链接:ural 1707. Hypnotoad's Secret 题目大意:给定N和M,然后N组s0, t0, Δs, Δt, k,每组能够计算出k个星星的坐标:M组a0, b0, c0, d0, ...

  7. day 1 堆 hash 线段树 树状数组 冰茶姬 字典树 二叉查找树

    来郑州的第二天,早上开始也没说什么就说了些注意安全,各种各样的注意安全... 冰茶姬: 原来再打食物链时看了一下冰茶姬,只注意了路径压缩,没想到还有什么按秩排序但确实快了不少... int find( ...

  8. E. Kefa and Watch hash 线段树

    2015-09-28 14:11:36 by opas 这题给的是一个字符串 把其中一些子串给取出来 判断是否是周期为d的字符串  还需要把 其中的一个区间完全变成一个数 ,然后在查询,我们把每个字符 ...

  9. 线段树总结 (转载 里面有扫描线类 还有NotOnlySuccess线段树大神的地址)

    转载自:http://blog.csdn.net/shiqi_614/article/details/8228102 之前做了些线段树相关的题目,开学一段时间后,想着把它整理下,完成了大牛NotOnl ...

随机推荐

  1. swift 学习- 13 -- 下标

    // 下标 可以定义在 类, 结构体, 和 枚举 中, 是访问集合, 列表或 序列中元素的快捷方式, 可以使用下标的索引, 设置 和 获取值, 而不需要再调用对应的存取方法, 举例来说, 用下标访问一 ...

  2. 3790:最短路径问题(HDU)

    Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的.   Inp ...

  3. LeetCode(70): 爬楼梯

    Easy! 题目描述: 假设你正在爬楼梯.需要 n 步你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2 ...

  4. 《剑指offer》 合并两个排序的链表

    本题来自<剑指offer> 合并两个排序的链表 题目: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 思路: A:采用递归的方式(C++ C ...

  5. antDesign 使用Form并进行表单验证

    import React from 'react'; import {Form,Input,Select,Button ...} from 'antd'; class PageName extends ...

  6. bzoj 2150

    然后考虑正解 我们发现,最坏情况就是每个点都派驻军队,所以答案至多是“.”的数目 而且,每个点都至多只有一个入度和一个出度,所以我们可以将每个点拆成两个点,一个作为入点,一个作为出点,然后所有图上能到 ...

  7. 解决:sudo: pip: command not found

    1-问题:Ubuntu下执行sudo pip install package-name 出现 sudo: pip: command not found 的问题. 2-原因:编译sudo的时候加入了–w ...

  8. (转)webpack和webpack-simple区别(如何引入css文件)

    博主最近研究vue+webpack的时候想引入css文件死活引入不出来,在webpack-simple那里却能引得出来,十分的纳闷,然后细心的调试了一下,原来这webpack和webpack-simp ...

  9. Jmeter 获取CSV行数

    import java.io.BufferedReader; import java.io.FileInputStream; String str = "E:\\Desktop\\WOS接口 ...

  10. 论文阅读笔记四:CTPN: Detecting Text in Natural Image with Connectionist Text Proposal Network(ECCV2016)

    前面曾提到过CTPN,这里就学习一下,首先还是老套路,从论文学起吧.这里给出英文原文论文网址供大家阅读:https://arxiv.org/abs/1609.03605. CTPN,以前一直认为缩写一 ...