[Manacher+bit]Palindrome
2024-10-20 15:59:41
https://nanti.jisuanke.com/t/15428
题目大意:离散表示的字符串,求其最长回文串长度。
解题关键:若只用Manacher算法,在统计sum时会超时,所以加一个树状数组来维护前n项和,即可AC。
注意进行Manacher时,i是从1开始的,不要小也不要大。
n天后更新:以前一直没搞清离线与动态维护的区别,今天终于理解了,此题可以开始直接离线求前n项和,因为以后不再改变,所以此题不需要bit维护。直接用一个数组统计一下前n项和即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node{
ll num;
char ch;
}s[];
ll p[],sum[],bit[];
ll t,n,a,k,id,maxlen,tt;
ll read(ll i){
ll res=;
while(i){
res+=bit[i];
i-=i&-i;
}
return res;
}
void add1(ll i,ll x){
while(i<){
bit[i]+=x;
i+=i&-i;
}
}
int main(){
scanf("%lld",&t);
while(t--){
memset(p,,sizeof p);
memset(bit,,sizeof bit);
memset(s,,sizeof s);
memset(sum,,sizeof sum);
scanf("%lld",&n);
k=;
for(int i=;i<n;i++){
k++;
//cin>>s[k].num>>s[k].ch;
scanf("%lld %c",&s[k].num,&s[k].ch);
tt=s[k].num;
if(s[k].ch==s[k-].ch){
s[k-].num+=s[k].num;
k--;
}
add1(k,tt);
}
id=,maxlen=;
s[].ch='*',s[k+].ch='#';
for(int i=;i<=k;i++){
if(p[id]+id>i) p[i]=min(p[*id-i],p[id]+id-i);
else p[i]=;
while(s[i-p[i]].ch==s[i+p[i]].ch&&s[i-p[i]].num==s[i+p[i]].num)++p[i];
if(p[i]+i>p[id]+id) id=i;
sum[i]=read(i+p[i]-)-read(i-p[i]);
if(s[i-p[i]].ch==s[i+p[i]].ch) sum[i]+=*min(s[i-p[i]].num,s[i+p[i]].num);
maxlen=max(maxlen,sum[i]);
}
printf("%lld\n",maxlen);
}
return ;
}
最新文章
- js 的点击事件
- mysql可以用这种方式<;<;! 输入内容 ! 做成脚本
- 编译器 expected unqualified-id before numeric constant 错误
- [转载] linux下打开windows txt文件中文乱码问题
- jQuery选择器之全面总结
- javascript-实现日期大写
- hdoj 1342 Lotto【dfs】
- Myeclipse2013 SVN安装方法
- Javscript中的null和undefined
- git 使用过程(三、文件的添加 修改)
- 单文件文件上传到服务器(HTML5+js+Java)
- mac链接linux终端,shell脚本发布代码
- C++Primer学习——函数
- 【一天一道LeetCode】#111. Minimum Depth of Binary Tree
- OutOfMemoryError 到底能不能被捕获?
- 序列化serialize与反序列化unserialize
- [Linux性能调优] 磁盘I/O队列调度策略
- Learning-Python【0】:Windows环境下Python2和Python3的安装
- P1272 重建道路
- idea 提交代码时提示 please tell me who you are .......