Hdu-6230 2017CCPC-哈尔滨站 A.Palindrome Manacher 主席树
题意:给你一个字符串,问你满足s[i]=s[2n-i]=s[2n+i-2]的子串(这子串长度为3n-2)有多少个,原字符串长度<=5e5
题解:对于这种子串,其实要满足2个回文,跑过一次Manacher后,len[i]表示以i向两边扩展最远的回文串长度,
那么对于答案,实际就是统计满足下列条件(i,j)的对数
i <= j
j - i <= len[i]
j - i <= len[j]
移项就是
i >= j - len[j]
j <= i + len[i]
那么相当于,枚举i,询问(i,i+len[i])区间内,有多少个数(这里指权值 j - len[j])小于等于i
就是问区间内小于某个数的个数,那就是主席树裸题(好像其他人都写的树状树状ORZ)
#include<bits/stdc++.h>
#define N 500505
using namespace std;
int sum[N*],rt[N*],lc[N*],rc[N*];
int a[N],b[N],len[N],p,node_cnt,cnt,value[N];
char s[N];
void build(int &t,int l, int r)
{
t=++node_cnt;
sum[t]=;
if (l==r) return;
int mid=(l+r)>>;
build(lc[t],l,mid);
build(rc[t],mid+,r);
}
int modify(int o,int l,int r)
{
int oo = ++node_cnt;
lc[oo]=lc[o]; rc[oo]=rc[o]; sum[oo]=sum[o]+;
if (l==r) return oo;
int mid=(l+r)>>;
if (p<=mid) lc[oo]=modify(lc[oo],l,mid);
else rc[oo]=modify(rc[oo],mid+,r);
return oo;
}
int query(int u,int v,int l,int r,int k)
{
int ans,mid=((l+r)>>);
if (r<=k) return sum[v]-sum[u];
if (l>k) return ;
ans=query(lc[u],lc[v],l,mid,k);
if (mid<k) ans=ans+query(rc[u],rc[v],mid+,r,k);
return ans;
}
void manacher()
{
int pos=,R=;
for (int i=;i<=cnt;i++)
{
if (i<R) len[i]=min(len[*pos-i],R-i); else len[i]=;
while (<=i-len[i]&&i+len[i]<=cnt&&s[i-len[i]]==s[i+len[i]]) len[i]++;
if (i+len[i]>R) {pos=i;R=i+len[i];}
}
for(int i=;i<=cnt;i++)
{
a[i]=i-len[i]+;
b[i]=a[i];
}
}
int main()
{
int k, n, q, nn, v, l, r, x,T;
scanf("%d\n",&T);
while (T--)
{
scanf("%s",s+);
cnt=strlen(s+);
manacher();
sort(b+,b++cnt);
nn=unique(b+,b+cnt+)-b-;
node_cnt=;
build(rt[],,nn);
for (int i=;i<=cnt;i++)
{
p=lower_bound(b+,b+nn+,a[i])-b;
rt[i]=modify(rt[i-],,nn);
}
long long ans=;
for (int i=;i<=cnt;i++)
{
x=lower_bound(b+,b+nn+,i)-b;
if (x==nn+) x--;
if (b[x]>i) x--;
if(x==) continue;
if(min(len[i]+i-,cnt)<i+) continue;
ans=ans+query(rt[i],rt[min(len[i]+i-,cnt)],,nn,x);
}
printf("%lld\n",ans);
}
}
Hdu-6230 2017CCPC-哈尔滨站 A.Palindrome Manacher 主席树的更多相关文章
- HDU 4729 An Easy Problem for Elfness (主席树,树上第K大)
转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove 题意:给出一个带边权的图.对于每一个询问(S , ...
- HDU - 6231 K-th Number (2017CCPC哈尔滨站 二分+尺取法)
Alice are given an array A[1..N] with N numbers. Now Alice want to build an array B by a parameter K ...
- 2017中国大学生程序设计竞赛-哈尔滨站 A - Palindrome
Palindrome Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Tota ...
- HDU 4729 An Easy Problem for Elfness(主席树)(2013 ACM/ICPC Asia Regional Chengdu Online)
Problem Description Pfctgeorge is totally a tall rich and handsome guy. He plans to build a huge wat ...
- 2019CCPC网络赛 C - K-th occurrence HDU - 6704(后缀数组+ST表+二分+主席树)
题意 求区间l,r的子串在原串中第k次出现的位置. 链接:https://vjudge.net/contest/322094#problem/C 思路 比赛的时候用后缀自动机写的,TLE到比赛结束. ...
- 杭电多校HDU 6601 Keen On Everything But Triangle(主席树)题解
题意: 有\(n\)根长度不一的棍子,q次询问,求\([L,R]\)区间的棍子所能组成的周长最长的三角形.棍长\(\in [1, 1e9]\),n\(\in [1, 1e5]\). 思路: 由于不构成 ...
- HDU 6230
Palindrome Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Tota ...
- 2017 ccpc哈尔滨 A题 Palindrome
2017 ccpc哈尔滨 A题 Palindrome 题意: 给一个串\(T\),计算存在多少子串S满足\(S[i]=S[2n−i]=S[2n+i−2](1≤i≤n)\) 思路: 很明显这里的回文串长 ...
- HDU 4417 Super Mario(主席树求区间内的区间查询+离散化)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
随机推荐
- 【SQL】CASE与DECODE
1. case..when case..when语句用于按照条件返回查询结果,如当我们想把emp表的工资按照多少分成几个不同的级别,并分别统计各个级别的员工数.SQL语句如下: select (cas ...
- 使用Ajax验证用户名
Ajax是一项很重要的技术,下面简要举个例子,来解释如何使用Ajax.步骤如下:使用Ajax验证用户名使用文本框的onBlur事件 使用Ajax技术实现异步交互创建XMLHttpRequest对象通过 ...
- (转)Openlayers 2.X加载高德地图
http://blog.csdn.net/gisshixisheng/article/details/44853881 概述: 前面的有篇文章介绍了Openlayers 2.X下加载天地图,本节介绍O ...
- Javascript语法,变量类型,条件,循环语句,函数,面向对象
1.JavaScript代码革两种存在形式: <!-- 方式一 --> <script type='txt/javascript' src='/js/comment.js'>& ...
- 【转载】jmeter将上一个接口返回值作为下一个接口的请求参数
第一:通过JSON Extractor 插件来提取JSON响应结果 原文地址:http://blog.csdn.net/dreamtl/article/details/68957122 接口响应结果, ...
- struts 2 action result类型
最近在管理公司老项目的时候发现如下代码: <bean name="detailPlayer" class="PlayAction" method=&quo ...
- 【剑指Offer】43、左旋转字符串
题目描述: 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S ...
- [系统资源]port range
ip_local_port_range 端口范围 sysctl Linux中有限定端口的使用范围,如果我要为我的程序预留某些端口,那么我需要控制这个端口范围, 本文主要描述如何去修改端口范围. /pr ...
- [luogu3244 HNOI2015] 落忆枫音(容斥原理+拓扑排序)
传送门 Description 给你一张 n 个点 m 条边的DAG,1 号节点没有入边.再向这个DAG中加入边 x→y ,求形成的新图中以 1 为根的外向树形图数 模 10^9+7 . Input ...
- 工厂模式的python实现
#1.什么是工厂模式 #2.工厂模式的分类 ''' 1. 简单工厂模式 2. 工厂方法模式 3. 抽象工厂方法模式 ''' #3.简单工厂模式的python实现 from abc import ABC ...