题意:给定字符串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. iphone怎么检测屏幕是否被点亮 (用UIApplication的Delegate)

    本文转载至  http://gaohaijun.blog.163.com/blog/static/176698271201161524857373/     问题:那位能说一下怎么能检测到iphone ...

  2. poj3292

    Semi-prime H-numbers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8677   Accepted: 3 ...

  3. Cow Contest(传递闭包)

    Cow Contest Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10450   Accepted: 5841 Desc ...

  4. zabbix server is not running解决办法

    正常安装完zabbix后,登录后zabbix监控报错zabbix server is not running: the information displayed may not be current ...

  5. 从内存中加载并启动一个exe

    windows似乎只提供了一种启动进程的方法:即必须从一个可执行文件中加载并启动.而下面这段代码就是提供一种可以直接从内存中启动一个exe的变通办法.用途嘛, 也许可以用来保护你的exe,你可以对要保 ...

  6. Virtualbox报错------> VirtualBox虚拟机下鼠标不正常的解决方法

    在Virtualbox虚拟机下,突然发现鼠标使用不正常.出现2个鼠标,一个是Ubuntu主机下面的鼠标,一个是Window7下的鼠标,但是Win7下的鼠标不可以看得到,但是点击鼠标左右键可以看到有反应 ...

  7. genymotion device manager列表没有

    1.第一种原因:链接Genymotion官网的网络超时,无法加载Genymotion device列表,解决办法百度一下:配置Genymotion代理服务器,联网下载 2.第二种可能:检查是否正确安装 ...

  8. css position: relative,absolute具体解释

    关于CSS中 position在布局中非常重要,查了非常多资料都说的非常难理解.以下说说个人的理解: 语法: position: relative | absolute relative: 对象遵循常 ...

  9. go语言之并发编程 channel

    前面介绍了goroutine的用法,如果有多个goroutine的话相互之间是如何传递数据和通信的呢.在C语言或者JAVA中,传输的方法包括共享内存,管道,信号.而在Go语言中,有了更方便的方法,就是 ...

  10. linux c编程:文件夹操作

    创建目录: 用mkdir函数创建目录: mkdir(const char *pathname, mode_t mode) 参数mode有下列的组合: S_ISUID 04000 文件的执行时设置用户I ...