hdu-6230 主席树/树状数组+离线
时间:2019-09-28
本文章向大家介绍hdu-6230 主席树/树状数组+离线,主要包括hdu-6230 主席树/树状数组+离线使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
刚开始是听说了要用manacher采取写的,但是不难看出要使用manacher,因为题目要求的1个半回文串,其实就是两个回文中心的交集,你要找两个回文中心,让它们的回文半径可以互相覆盖即可。问题转化成了对于一个回文中心,它覆盖的左侧的所有回文中心中( 向右覆盖的范围超过i )这样的点的数量。这样就变成了求区间中大于x的数的个数,可以用主席树解决。
#include<iostream> #include<cstring> #include <string> #include<algorithm> using namespace std; typedef long long ll; const int maxn=1e6+20; const int maxm=2e7+20; char s[maxn],s_new[maxn]; int p[maxn]; int init() { int len=(int)strlen(s); s_new[0]='$'; s_new[1]='#'; int j=2; for(int i=0;i<len;i++) { s_new[j++]=s[i]; s_new[j++]='#'; } s_new[j]=0; return j; } int manacher() { int len=init(); int id=0,mx=0; for(int i=1;i<len;i++) { if(i<mx) p[i]=min(p[2*id-i],mx-i); else p[i]=1; while(s_new[i-p[i]]==s_new[i+p[i]]) p[i]++; if(mx<i+p[i]) { id=i; mx=i+p[i]; } } return len; } int n,m,cnt; int tree[maxn],ls[maxm],rs[maxm],sum[maxm]; void update(int k,int pre,int &now,int l,int r){ now=++cnt; ls[now]=ls[pre]; rs[now]=rs[pre]; sum[now]=sum[pre]+1; if(l==r){ return; } int m=(l+r)>>1; if(k<=m) update(k,ls[pre],ls[now],l,m); else update(k,rs[pre],rs[now],m+1,r); } int query(int a,int b,int l,int r,int L,int R){ if(L<=l&&r<=R){ return sum[b]-sum[a]; } int ans=0; int mid=(l+r)>>1; if(mid>=L) ans+=query(ls[a], ls[b], l, mid, L, R); if(mid<R) ans+=query(rs[a], rs[b], mid+1, r, L, R); return ans; } int main() { int T; cin>>T; while(T--){ cnt=0; tree[0]=ls[0]=rs[0]=sum[0]=0; scanf("%s",s); int len=manacher(); m=len/2; ll ans=0; for(int i=1;i<m;i++) { int L=i-p[i*2]/2+1; if(L!=i) update(L,tree[i-1],tree[i],1,m); else tree[i]=tree[i-1]; } for(int i=1;i<m;i++){ int R=i+p[i*2]/2-1; int t=query(tree[i], tree[R], 1, m, 1, i); ans+=t; } printf("%lld\n",ans); } }
但是我的板子一直过不了,一直TLE,借用了以为其他人的主席树板子才能过,好迷啊。
借用模版:https://blog.csdn.net/know_heng/article/details/78590061
待更新:树状数组离线做法
原文地址:https://www.cnblogs.com/King-of-Dark/p/11603120.html
- 双边过滤算法
- C++对于大型图片的加载缩放尝试
- ijg库解码超大型jpeg图片
- JS基础(下)
- Go语言_并发篇
- AttributeError: 'int' object has no attribute 'log'
- makefile在编译的过程中出现“except class name”
- 调参过程中的参数 学习率,权重衰减,冲量(learning_rate , weight_decay , momentum)
- 【Golang语言社区】游戏编程--js开发实现简单贪吃蛇游戏(20行代码)
- mxnet框架样本,使用C++接口
- faster-rcnn中ROI_POOIING层的解读
- RNN的简单的推导演算公式(BPTT)
- Golang语言为结构体排序
- 【Golana语言社区】window应该开发之--cmd杀进程
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【教程】制作高品质铃声,苹果/安卓通用
- 【iOS】应用多开教程
- ggplot2画KEGG富集柱形图
- Go语言函数间传递切片的问题
- Go语言函数间传递数组的问题
- Kubernetes v1.8 对 GPU 的支持
- 【教程】checkra1n越狱教程+常用插件推荐
- 【教程】抓取网页内视频的五种方法
- 了解 Anaconda
- 【实用】教你识别下载“全家桶”
- 【iOS】修改checkra1n+chimera环境(chimera1n)
- 在 istio 中限制 namespace 访问外部资源
- 【iOS】浅析近期越狱工具+“平刷”工具
- XGBoost Operator源码分析
- 【杂货】制作checkra1n启动盘思路