题意:给定字符串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. group_concat函数导致的主从同步异常

    group_concat函数导致的主从同步异常的问题总结 今天在处理一个group_concat函数导致的主从异常的问题,排查过程比较简单,不过第一次遇到这个问题记录一下排查的思路,后面如果再遇到其他 ...

  2. And Then There Was One(约瑟夫环)

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  3. hdu 2108 Shape of HDU【判断多边形是否是凸多边形模板】

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=2108 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  4. 微信小程序报“app.json”错误解决办法

    1.亲测 “app.json未找到入口 app.json 文件,或者文件读取失败,请检查后重新编译.” 是由于新创建的界面xxx.json所在的文件夹为0KB造成的,你可以试着在xxx.json文件内 ...

  5. Delphi 64与32位的差异

    Delphi 64与32位的差异   最近,Delphi推出了64位预览版本, 我做为一个忠实的Delphier, 看到这消息后,第一时间学习,并写下这个做为以后的参考资料. 相同点: 在Delphi ...

  6. springcloud zuul 使用zuulfilter 修改请求路径和响应头

    最近做项目有一个需求:一个网盘系统,文件存放在分布式文件系统中,之前的文件下载统一走的文件下载服务,现在需要在单文件下载的时候不需要走文件下载服务,而是直接访问文件系统上的路径,响应的时候修改响应头, ...

  7. sin6_addr打印:string to sockaddr_in6 and sockaddr_in6 to string

    函式原型: #include <arpa/inet.h> const char *inet_ntop(int af, const void *src, char *dst, socklen ...

  8. C#聚合运算方法

    Aggregate 对集合值执行自定义聚合运算 Average 计算集合平均值 Count 对集合的元素惊醒计数,还可以仅对满足某一谓词函数的元素进行计数 LongCount 对大型集合中的元素进行计 ...

  9. CodeForces - 580C Kefa and Park 【BFS】

    题目链接 http://codeforces.com/problemset/problem/580/C 题意 根节点是 1 然后所有的叶子结点都是饭店 从根节点到叶子结点的路径上 如果存在 大于m 个 ...

  10. Data Structure Linked List: Reverse a Linked List in groups of given size

    http://www.geeksforgeeks.org/reverse-a-list-in-groups-of-given-size/ #include <iostream> #incl ...