Gym - 100570E:Palindrome Query (hash+BIT+二分维护回文串长度)
题意:给定字符串char[],以及Q个操作,操作有三种:
1:pos,chr:把pos位置的字符改为chr
2:pos:问以pos为中心的回文串长度为多长。
3:pos:问以pos,pos+1为中心的回文串长度为多长。
思路:用hash表示一段字符串或者连续子串。我们用BIT记录hash前缀和,那么也可以用BIT修改前缀和。然后blabla,乱搞就行了。
当然为了保险,最好用双hash。
(此题暴力也可以过!
暴力代码:3962ms
- #include<bits/stdc++.h>
- #define rep(i,a,b) for(int i=a;i<=b;i++)
- using namespace std;
- const int maxn=;
- char c[maxn],t;
- int main()
- {
- int N,Q,opt,x;
- scanf("%s%d",c+,&Q); N=strlen(c+);
- while(Q--){
- scanf("%d%d",&opt,&x);
- if(opt==){
- scanf(" %c",&t); c[x]=t;
- }
- else if(opt==){
- int i=x,j=x;
- while(i->=&&j+<=N&&c[i-]==c[j+]) i--,j++;
- printf("%d\n",j-i+);
- }
- else {
- if(c[x]!=c[x+]) { puts("-1"); continue;}
- int i=x,j=x+;
- while(i->=&&j+<=N&&c[i-]==c[j+]) i--,j++;
- printf("%d\n",j-i+);
- }
- }
- return ;
- }
hash+BIT+二分:93ms(目前排第一?
- #include<bits/stdc++.h>
- #define uint unsigned int
- using namespace std;
- const int maxn=;
- const uint seed=;
- char c[maxn]; uint sum[maxn][],p[maxn]; int N;
- uint query(int x,int opt){
- uint res=; while(x) {
- res+=sum[x][opt]; x-=(-x)&x;
- } return res;
- }
- bool check(int L,int R)
- {
- if(L<||R>N) return false;
- uint h1=(query(R,)-query(L-,))*p[L-];
- uint h2=(query(R,)-query(L-,))*p[N-R];
- if(h1==h2) return true; return false;
- }
- int main()
- {
- int Q,i,j;
- scanf("%s%d",c+,&Q); N=strlen(c+);
- p[]=;
- for(i=;i<=N;i++) p[i]=p[i-]*seed;
- for(i=;i<=N;i++){
- for(j=i;j<=N;j+=(-j)&j) sum[j][]+=p[N-i]*c[i];
- for(j=i;j<=N;j+=(-j)&j) sum[j][]+=p[i-]*c[i];
- }
- int opt,x,L,R,Mid,ans; char chr;
- while(Q--){
- scanf("%d%d",&opt,&x);
- if(opt==){
- scanf(" %c",&chr);
- for(j=x;j<=N;j+=(-j)&j) sum[j][]+=p[N-x]*(chr-c[x]);
- for(j=x;j<=N;j+=(-j)&j) sum[j][]+=p[x-]*(chr-c[x]);
- c[x]=chr;
- }
- else if(opt==){
- L=; R=N; ans=;
- while(L<=R){
- Mid=(L+R)>>;
- if(check(x-Mid,x+Mid)) ans=Mid,L=Mid+;
- else R=Mid-;
- }
- printf("%d\n",ans*+);
- }
- else{
- L=; R=N; ans=-;
- while(L<=R){
- Mid=(L+R)>>;
- if(check(x-Mid,x++Mid)) ans=Mid,L=Mid+;
- else R=Mid-;
- }
- printf("%d\n",ans==-?-:ans*+);
- }
- }
- return ;
- }
Gym - 100570E:Palindrome Query (hash+BIT+二分维护回文串长度)的更多相关文章
- Gym 100570E : Palindrome Query
De Prezer loves palindrome strings. A string s1s2...sn is palindrome if and only if it is equal to i ...
- leetcode:Palindrome Number (判断数字是否回文串) 【面试算法题】
题目: Determine whether an integer is a palindrome. Do this without extra space. Some hints: Could neg ...
- Extend to Palindrome UVA - 11475(补成回文串)
题意: 就是用最少的字符把原字符串补成回文串 解析: emm/.../网上都是用kmp和后缀数组做的 我没想到这俩的思路...emmm... 想到了exkmp的 就是原串和逆串匹配一下 注意要保证 ...
- [CSP-S模拟测试]:回文串(hash+二分)
题目描述 $ASDFZ$的机房中不仅有红太阳,还有蓝太阳和原谅色太阳.有一天,太阳们来到机房,发现桌上有不知道哪个蒟蒻放上的问题:令$F(A,B)$表示选择一个串$A$的非空前缀$S$和串$B$的非空 ...
- LOJ 2452 对称 Antisymmetry——用hash求回文串数
概念 用hash求最长回文串/回文串数 首先,易知,回文串具有单调性. 如果字符串 $s[l...r]$ 为回文串串,那么 $s[x...y]$($l < x, y < r$ 且 $|l- ...
- [LeetCode] Palindrome Partitioning II 拆分回文串之二
Given a string s, partition s such that every substring of the partition is a palindrome. Return the ...
- bzoj 2124 等差子序列 树状数组维护hash+回文串
等差子序列 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 1919 Solved: 713[Submit][Status][Discuss] Desc ...
- BZOJ4755 JSOI2016扭动的回文串(二分答案+哈希)
显然答案应该是由单串以某位置为中心的极长回文串继续在另一个串里拓展得到的.枚举中间位置二分答案,哈希判断即可.注意考虑清楚怎么处理偶回文,比如像manacher一样加分隔符. #include< ...
- CF452F等差子序列 & 线段树+hash查询区间是否为回文串
记录一下一个新学的线段树基础trick(真就小学生trick呗) 给你一个1到n的排列,你需要判断该排列内部是否存在一个3个元素的子序列(可以不连续),使得这个子序列是等差序列.\(n\) <= ...
随机推荐
- Root(hdu5777+扩展欧几里得+原根)
Root Time Limit: 30000/1500 ...
- 看了就很快学会jQuery
一.jQuery简介与第一个jQuery程序 1.1.jQuery简介 1.2.jQuery特点 1.3.jQuery版本 1.4.获得jQuery库 1.5.第一个jQuery程序 二.jQuery ...
- 使用onepage-scroll全屏滚动插件时的注意事项
如果项目需要在移动端访问时需要设置responsiveFallback属性,并且在此之前还需要检测浏览器的级别(引入modernizr.js文件) var $responsiveFallback = ...
- hdu 5969 最大的位或
最大的位或 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- OSI模型第三层网络层-初识路由协议
1.路由协议: 顾名思义就是路由器所使用的协议. 分类: (1)按照作用范围分类,IGP(类型)内部网关协议(rip,ospf,isis),EGP(类型)边界路由协议(bgp) 把互联网比作整个世界土 ...
- 九度OJ 1336:液晶屏裁剪 (GCD)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:983 解决:228 题目描述: 苏州某液晶厂一直生产a * b大小规格的液晶屏幕,由于该厂的加工工艺限制,液晶屏的边长都为整数.最近由于市场 ...
- Lock和Condition
1 什么是可重入锁 可重入锁是说一个线程在已经获取了该锁的情况下,还可以再次获取该锁. 主要的应用场景: 可重入锁指的是在一个线程中可以多次获取同一把锁,比如:一个线程在执行一个带锁的方法,该方法中又 ...
- 算法调参 weight_ratio, weight_seqratio
from openpyxl import Workbook import xlrd import time import Levenshtein as Le target_city_list = [' ...
- Java实现时间日期格式转换示例
package com.hanqi.util; import java.text.ParseException; import java.text.SimpleDateFormat; import j ...
- Mac下XAMPP环境中安装MySQLdb
环境: Mac OS X. Mac下安装MySQLdb模块着实多了些步骤. 用easy_install或者pip安装时有两大问题,"mysql_config not found"和 ...