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]