题目链接: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

string(1,i)=∑i=1i(string[i]×xi)

string(1,i) = \sum_{i=1}^i (string[i]\times x^i)

这样就能将一个字符串映射为一个正整数,

虽然这样计算的结果很可能是相同的,,但是可喜的是相同的概率十分小.所以可以直接使用.

但是一般我们采用的是unsigned long long int,在计算中也不需要取模操作,因为运算的自然溢出就相当于对264−12^64-1取模了。

这样下来,我们只需要将字符串正着hash一遍,倒着hash一遍,就可以了,

因为有修改操作,所以我们采用BIT维护下。

注意:判定两个子串的时候,x的指数不对应,只需要在小的那个结果乘上差的那部分xix^i就好了

附本题代码
————————————————————————————————————————————

#include <bits/stdc++.h>using namespace std;
typedef long long int LL;
typedef unsigned long long int ULL;
const int N = 1e6+7;ULL sum[N][2];int len ;
#define lowbit(x) (x&-x)
void update(int i,ULL v,int w){for(;i<=len;i+=lowbit(i)) sum[i][w]+=v;
}
void update2(int i,ULL v,int w){for(;i<=len;i+=lowbit(i)) sum[i][w]-=v;
}
ULL getSum(int i,int w){ULL res = 0;for(;i;i-=lowbit(i)) res+=sum[i][w];return res;
}char a[N],b[10];
ULL h[N];
void init(){h[0]=1;for(int i=1;i<N;i++)h[i]=h[i-1]*29;
}
int main(){init();int _;scanf("%d",&_);while(_--){memset(sum,0,sizeof(sum));scanf("%s",a+1);len = strlen(a+1);for(int i=1;a[i];i++)update(i,h[i]*(a[i]-'a'+1),1),update(i,h[i]*(a[len-i+1]-'a'+1),0);int n,l,r;scanf("%d",&n);while(n--){scanf("%s",b);if(b[0]=='Q'){scanf("%d%d",&l,&r);ULL tem = getSum(r,1)-getSum(l,1);ULL tmp = getSum(len-l+1,0)-getSum(len-r+1,0);if(tem*h[len-r+1] == tmp*h[l]) puts("yes");else           puts("no");}else {scanf("%d%s",&l,b);update2(l,h[l]*(a[l]-'a'+1),1);update2(len-l+1,h[len-l+1]*(a[l]-'a'+1),0);a[l]=b[0];update(l,h[l]*(a[l]-'a'+1),1);update(len-l+1,h[len-l+1]*(a[l]-'a'+1),0);}}}return 0;
}

hrbustoj 1681 回文串 [BIT]【字符串hash】相关推荐

  1. 洛谷 P4324 [JSOI2016]扭动的回文串 manacher+字符串hash

    题目描述 JYY有两个长度均为 NNN 的字符串 AAA 和 BBB. 一个扭动字符串 S(i,j,k)S(i,j,k)S(i,j,k) 由 AAA 中的第 iii 个字符到第 jjj 个字符组成的子 ...

  2. bzoj4755: [Jsoi2016]扭动的回文串 manacher+二分+Hash

    bzoj4755: [Jsoi2016]扭动的回文串 Description JYY有两个长度均为N的字符串A和B. 一个"扭动字符串S(i,j,k)由A中的第i个字符到第j个字符组成的子串 ...

  3. LeetCode 214. 最短回文串(字符串哈希)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串. 找到并返回可以用这种方式转换的最短回文串. 示例 1: 输入: "aace ...

  4. LeetCode 131. 分割回文串【字符串,回溯算法】

    131. 分割回文串 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 .返回 s 所有可能的分割方案. 回文串 是正着读和反着读都一样的字符串. 示例 1: 输入:s = &q ...

  5. HDU6599:求本质不同的子串(回文串)长度及数量

    目录 hdu6599题意: manacher+后缀自动机+倍增 \(O(nlog(n))\) manacher+后缀数组+二分 \(O(nlog(n))\) 回文树(回文自动机) \(O(n)\) @ ...

  6. UVA - 11584 Partitioning by Palindromes(划分成回文串)(dp)

    题意:输入一个由小写字母组成的字符串,你的任务是把它划分成尽量少的回文串,字符串长度不超过1000. 分析: 1.dp[i]为字符0~i划分成的最小回文串的个数. 2.dp[j] = Min(dp[j ...

  7. 每天一道LeetCode-----有效回文串

    Valid Palindrome 原题链接Valid Palindrome 判断给定字符串是否是回文串,只需要比较ASCII码的字母和数字即可,其它符号跳过 首先介绍两个函数,在这里使用比较方便 in ...

  8. [nowcoder]优美的回文串

    题面 链接:https://www.nowcoder.com/questionTerminal/cf00949583604f8c9f3315fd64236a8c?orderByHotValue=1 来 ...

  9. 怎么判断一个字符串的最长回文子串是否在头尾_【Leetcode每日打卡】最长回文串...

    干货预警:所有文章都会首发于我的公众号[甜姨的奇妙冒险],欢迎watch. 一.来历: 力扣从3月开始开启了每日一题打卡活动,于是跟风加入了打卡大军,这两天写评论.发题解,没想到反响还不错,收到了来自 ...

最新文章

  1. 流程 - 什么是真正的Scrum?
  2. ORACLE 创建作业JOB例子
  3. 在当当买了python怎么下载源代码-爬虫实战一:爬取当当网所有 Python 书籍
  4. SCALA Linux安装:JAVA.LANG.NUMBERFORMATEXCEPTION: FOR INPUT FOR INPUT STRING: “0X100“
  5. 15个IT技术人员必须思考的问题
  6. 程序员如何快速成长为IT精英
  7. java学习(92):线程的创建方法一
  8. QML工作笔记-Key Element的使用
  9. 如何进行并发测试_如何对网站进行测试?
  10. linux gnu ld,GNU LD用法
  11. python实现DDA算法
  12. 【App设计】互联网+商业计划书
  13. si4438使用stm32f103配置调试成功!
  14. 史上最健康的养胃时间表
  15. 现在可用:Yggdrasil图标包
  16. 教你用人工智能写文章写歌词写对联
  17. python bool类型_python bool数据类型
  18. 自动控制之PID原理
  19. C# 10分钟完成百度翻译(机器翻译)——入门篇
  20. C++程序员发展方向有哪些?

热门文章

  1. 前端路由的两种模式:hashhistory
  2. 如何用matlab自动发邮件,用matlab发送邮件
  3. Vue 渲染多个Echarts图表
  4. eclipse选择一行 快捷键
  5. 基于php003飞机票航空售票查询预定系统
  6. Flutter 语言国际化状态管理
  7. gitmodel学习笔记(一):利用sympy分析高等数学
  8. 百趣代谢组学实验室分享-细胞培养避坑指南
  9. 【selenium】对键盘的的操作(控制键盘的输入,以及键盘组合操作比如复制粘贴) ;对鼠标的操作(单击,双击,右击,拖拽)
  10. selenium python自动化测试教程_Python selenium自动化测试模型图解