[原创]hrbustoj 1681 回文串 [BIT]【字符串 hash】
2017-05-09 14:02:21 Tabris_ 阅读数:566
博客爬取于 2020-06-14 22:40:43
以下为正文
版权声明:本文为 Tabris 原创文章,未经博主允许不得私自转载。
https://blog.csdn.net/qq_33184171/article/details/71453698
题目链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1681
————————————————————————————————————————————
回文串
Time Limit: 1000 MS Memory Limit: 32768 K
Total Submit: 121(25 users) Total Accepted: 30(12 users) Rating: Special Judge: No
Description
现在我们有一个很长很长的字符串,并且我们将有两种操作。
C i y:将第 i 个字符变成 y
Q i j:检查第 i 个字符到第 j 个字符是否为一个回文串
Input
输入的第一行是一个整数 T,表示一共有 T 组测试数据;
对于每组测试数据,第一行包含一个字符串长度不超过 1000000。
接下来一行为一个整数 N 代表操作次数。N 不超过 1000000
接下来 N 行包含一种操作。
所有的字母都是小写字母。
Output
对于每种操作,如果相应的字符串为回文串输出"yes",后则输出"no"。
Sample Input
1
aaaaa
4
Q 1 5
C 2 b
Q 1 5
Q 1 3
Sample Output
yes
no
yes
————————————————————————————————————————————
我们判定一个字符串是不是回文的只需判断正过来和倒过来是不是相等的就好了。
对于字符串是不是相等的 ,正常需要 O(length)判定,对于本题,显然是不可取的。
所以介绍下字符串 hash 算法,
hash 就是映射吧,将一个字符串集合中的每个映射为一个值,这些值互不相同
随意设一个常数 x
这样就能将一个字符串映射为一个正整数,
虽然这样计算的结果很可能是相同的,,但是可喜的是相同的概率十分小。所以可以直接使用。
但是一般我们采用的是 unsigned long long int,在计算中也不需要取模操作,因为运算的自然溢出就相当于对 $2^64-1$ 取模了。
这样下来,我们只需要将字符串正着 hash 一遍,倒着 hash 一遍,就可以了,
因为有修改操作,所以我们采用 BIT 维护下。
注意:判定两个子串的时候,x 的指数不对应,只需要在小的那个结果乘上差的那部分x^i就好了
附本题代码
————————————————————————————————————————————
1 | # include <bits/stdc++.h> |


