[Manacher+bit]Palindrome
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 ;
}
[Manacher+bit]Palindrome的更多相关文章
- Manacher算法 & Palindrome
马拉车用于解决最长回文子串问题,重点是子串,而不是子序列,时间复杂度为O(n). 解释一下变量的意义: Len[i]数组去存第i个位置到mx位置的长度 id记录上一次操作的位置(这个操作可以看模板) ...
- 【学习笔记】字符串—马拉车(Manacher)
[学习笔记]字符串-马拉车(Manacher) 一:[前言] 马拉车用于求解连续回文子串问题,效率极高. 其核心思想与 \(kmp\) 类似:继承. --引自 \(yyx\) 学姐 二:[算法原理] ...
- Codeforces Gym 100570 E. Palindrome Query Manacher
E. Palindrome QueryTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100570/pro ...
- Palindrome(poj3974)(manacher算法)
http://poj.org/problem?id=3974 Palindrome Time Limit: 15000MSMemory Limit: 65536K Total Submissions: ...
- Palindrome(Manacher)
Palindrome Time Limit: 15000MS Memory Limit: 65536K Total Submissions: 6183 Accepted: 2270 Descr ...
- Palindrome(最长回文串manacher算法)O(n)
Palindrome Time Limit:15000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit ...
- Codeforces Beta Round #7 D. Palindrome Degree manacher算法+dp
题目链接: http://codeforces.com/problemset/problem/7/D D. Palindrome Degree time limit per test1 secondm ...
- hdu6230 Palindrome(manacher+树状数组)
题目链接: Palindrome Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Other ...
- POJ3974:Palindrome(Manacher模板)
Palindrome Time Limit: 15000MS Memory Limit: 65536K Total Submissions: 14021 Accepted: 5374 题目链接 ...
随机推荐
- 1django 视图与网址
创建一个项目,名字叫mysite django-admin startproject mysite(项目名) 成功后,看到如下样式 mysite ├── manage.py └── mysite ├─ ...
- docker swarm部署spring cloud服务
一.准备docker swarm的集群环境 ip 是否主节点 192.168.91.13 是 192.168.91.43 否 二.准备微服务 ①eureka服务 application.y ...
- zabbix实现mysql数据库的监控(四)
前面介绍的内容都是用第三方开发好的插件进行mysql监控的,可能有些我们关心的监控内容并不在其中,这时一种常用的方法就是定义我们自己的脚本并将它整合到zabbix中,从而在原有监控的基础上进行有力的补 ...
- CSS3分享按钮动画特效
在线演示 本地下载
- Never Go Away
Hey if you ever want to leave it allif you ever want to lose control leave it all escape so far away ...
- FOJ 2213 简单几何
题意:给你两个圆的圆心坐标和半径,判断两个圆公切线数目. 思路:考虑两个圆间公切线的情况,两个圆的位置关系分为相离,相交,外切,内切,内含,重合,公切线数分别为4,2,3,1,0,-1. #inclu ...
- Victor/ArrayList/LinkedList/Stack/CopyOnWriteArrayList 区别
Victor:采用数组的方式存储数据,与ArrayList相同,线程安全.性能比ArrayList差 ArrayList:采用数据的方式存储数据,线程不安全.ArrayList使用数组来存储数据,使用 ...
- pugixml 1.9 manual解读(部分)
Plain character data nodes (node_pcdata) represent plain text in XML. PCDATA nodes have a value, but ...
- java:练习学校学生
java:练习学校学生 一个学生对应一个学校 一个学校对应多个学生 Student类,School类,Demo测试类 Student: public class Student { private S ...
- python 链接MS SQL
cnxn = pyodbc.connect(driver='{SQL Server}', host=server, database=db1, trusted_connection=tcon, use ...