题意:给定字符串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+二分维护回文串长度)的更多相关文章

  1. Gym 100570E : Palindrome Query

    De Prezer loves palindrome strings. A string s1s2...sn is palindrome if and only if it is equal to i ...

  2. leetcode:Palindrome Number (判断数字是否回文串) 【面试算法题】

    题目: Determine whether an integer is a palindrome. Do this without extra space. Some hints: Could neg ...

  3. Extend to Palindrome UVA - 11475(补成回文串)

    题意: 就是用最少的字符把原字符串补成回文串 解析: emm/.../网上都是用kmp和后缀数组做的 我没想到这俩的思路...emmm... 想到了exkmp的  就是原串和逆串匹配一下  注意要保证 ...

  4. [CSP-S模拟测试]:回文串(hash+二分)

    题目描述 $ASDFZ$的机房中不仅有红太阳,还有蓝太阳和原谅色太阳.有一天,太阳们来到机房,发现桌上有不知道哪个蒟蒻放上的问题:令$F(A,B)$表示选择一个串$A$的非空前缀$S$和串$B$的非空 ...

  5. LOJ 2452 对称 Antisymmetry——用hash求回文串数

    概念 用hash求最长回文串/回文串数 首先,易知,回文串具有单调性. 如果字符串 $s[l...r]$ 为回文串串,那么 $s[x...y]$($l < x, y < r$ 且 $|l- ...

  6. [LeetCode] Palindrome Partitioning II 拆分回文串之二

    Given a string s, partition s such that every substring of the partition is a palindrome. Return the ...

  7. bzoj 2124 等差子序列 树状数组维护hash+回文串

    等差子序列 Time Limit: 3 Sec  Memory Limit: 259 MBSubmit: 1919  Solved: 713[Submit][Status][Discuss] Desc ...

  8. BZOJ4755 JSOI2016扭动的回文串(二分答案+哈希)

    显然答案应该是由单串以某位置为中心的极长回文串继续在另一个串里拓展得到的.枚举中间位置二分答案,哈希判断即可.注意考虑清楚怎么处理偶回文,比如像manacher一样加分隔符. #include< ...

  9. CF452F等差子序列 & 线段树+hash查询区间是否为回文串

    记录一下一个新学的线段树基础trick(真就小学生trick呗) 给你一个1到n的排列,你需要判断该排列内部是否存在一个3个元素的子序列(可以不连续),使得这个子序列是等差序列.\(n\) <= ...

随机推荐

  1. java.lang.IllegalStateException: ImageView no longer exists. You should not use this PhotoViewAttacher any more.

    java.lang.IllegalStateException: ImageView no longer exists. You should not use this PhotoViewAttach ...

  2. python 深复制与浅复制------copy模块

    模块解读: 浅复制: x = copy.copy(y)深复制: x = copy.deepcopy(y)(注:模块特有的异常,copy.Error) 深copy与浅copy的差别主要体现在当有混合对象 ...

  3. SVM vs. Softmax

    http://cs231n.github.io/linear-classify/

  4. php生成条形码: barcodegen

    实例结构: 1. index.html <!DOCTYPE html> <html> <head> <title>Test with embedded ...

  5. js apply / call 函数

    这两个函数的作用是: 将函数绑定到另外一个对象上去运行 用call和apply应用另一个函数(类)以后,当前的函数(类)就具备了另一个函数(类)的方法或是属性,这也能够称之为“继承”. functio ...

  6. Nodejs课堂笔记—第一课:修改Webstorm的默认主题

    最近小半年一直在忙于研究Docker源码,也在写相关的分析文章.但受限于某些条件不能发布到网上,甚为郁闷.而最近几天,接到新的开发任务,需要使用nodejs.之前一直听说过nodejs,但从来没有真正 ...

  7. 网络的分层协议总结(转发:https://www.cnblogs.com/Zhang-wj/p/5907534.html)

    网络的分层协议总结 OSI七层模型OSI 中的层            功能                                                        TCP/IP ...

  8. vmware 下的三种网络模式

    VMWare提供三种工作模式桥接(bridge).NAT(网络地址转换)和host-only(主机模式). 桥接模式 在桥接模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机(主机和 ...

  9. 通过设置PHPSESSID保存到cookie实现免登录

    $cookieParams = session_get_cookie_params(); session_set_cookie_params( 3600,// 设置sessionID在cookie中保 ...

  10. windows下python常用库的安装

    windows下python常用库的安装,前提安装了annaconda 的python开发环境.只要已经安装了anaconda,要安装别的库就很简单了.只要使用pip即可,正常安装好python,都会 ...