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 n small English letters. The second line contains an integer m that is the number of queries (5 ≤ n, m ≤ 10 5). The next m lines contain the queries.
Each query has either form “change i a”, or “palindrome? j k”, where i, j, k are integers (1 ≤ i ≤ n; 1 ≤ j ≤ k ≤ n), and character a is a small English letter.
Output
To all second type queries, you should output “Yes” on a single line if substring s j… s k is a palindrome and “No” otherwise.
Example
input output
abcda
5
palindrome? 1 5
palindrome? 1 1
change 4 b
palindrome? 1 5
palindrome? 2 4
No
Yes
Yes
Yes

题意很简单,就是单点更新某个字符,然后询问某个区间是否为回文串。

思路:首先想到利用哈希值来判断回文串,如果左右哈希值相同就是回文串。所以这题我们使用线段树,维护这个区间的左右哈希值,最后再查询,注意最后查询的时候要记录查询到当前区间时,已经查询到的长度。因为这要作为幂值
主要就是对线段树的变形,注意这个幂值。
字符串的哈希是 Hash(str[l,r]) = str[l]+str[l+1]*B + str[l+2]*B^2 + …. + str[r]*B^(r-l);
所以字符串PushUp的时候也是记录左右的长度。

int L = tree[lson].len();
    int R = tree[rson].len();
    tree[k].Lv = tree[lson].Lv + tree[rson].Lv*Pow[L];
    tree[k]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值