hdu 4125 Moles(kmp+树状数组)
题目链接:hdu 4125 Moles
题意:
给你n个数,让你按键值建一个平衡二叉树,然后奇数为0,偶数为1,然后可以遍历这颗树得到一个欧拉序列,现在给你一个串,问你出现了几次。
题解:
建树的时候要引用一个结论:就是新插入的数的父亲,要么是比它大的最小的那个元素,要么是比它小的最大的那个元素。
这样才能nloglogn建树,其实可以用set nlogn建树,但是空间要被卡,然后换用树状数组来替代set。
我这份代码没用KMP跑了4000+,用了kmp只会跑2000+。kmp还是在大串上比较有优势。
1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i<=b;i++) 3 using namespace std; 4 const int N=6e5+7; 5 int t,n,cas,a[N],l[N],r[N],S[N],top,len,C[N],root,mi,mx; 6 char s[N*2],b[N],vis[N]; 7 8 void add(int x){while(x<=n)C[x]++,x+=x&-x;} 9 inline int sum(int x){int an=0;while(x)an+=C[x],x-=x&-x;return an;} 10 11 void insert(int x) 12 { 13 add(x); 14 int tt=sum(x); 15 if(!root) 16 { 17 root=mi=mx=x; 18 return; 19 } 20 if(x>mx) 21 { 22 r[mx]=x,mx=x; 23 return; 24 } 25 if(x<mi) 26 { 27 l[mi]=x,mi=x; 28 return; 29 } 30 mi=min(mi,x),mx=max(mx,x); 31 int ll=1,rr=x-1,mid; 32 while(ll<rr) 33 { 34 mid=ll+rr>>1; 35 if(sum(mid)==tt-1)rr=mid; 36 else ll=mid+1; 37 } 38 if(!r[rr]) 39 { 40 r[rr]=x; 41 return; 42 } 43 ll=x+1,rr=n; 44 while(ll<rr) 45 { 46 mid=ll+rr>>1; 47 if(sum(mid)!=tt)rr=mid; 48 else ll=mid+1; 49 } 50 l[rr]=x; 51 } 52 53 void init() 54 { 55 root=0; 56 F(i,0,n)C[i]=0; 57 F(i,1,n)l[i]=r[i]=0; 58 F(i,1,n)insert(a[i]); 59 } 60 61 void dfs() 62 { 63 F(i,0,n)vis[i]=0; 64 top=1,S[1]=a[1]; 65 while(top) 66 { 67 int now=S[top]; 68 s[len++]='0'+(now&1); 69 if(l[now]&&!vis[l[now]]){S[++top]=l[now];continue;} 70 if(r[now]&&!vis[r[now]]){S[++top]=r[now];continue;} 71 top--; 72 vis[now]=1; 73 } 74 } 75 76 int main() 77 { 78 scanf("%d",&t); 79 while(t--) 80 { 81 scanf("%d",&n); 82 F(i,1,n)scanf("%d",a+i); 83 scanf("%s",b); 84 int lenb=strlen(b); 85 init(); 86 len=0; 87 dfs(); 88 int ans=0; 89 F(i,0,len-1) 90 { 91 if(s[i]==b[0]) 92 { 93 int p=i,fg=1; 94 F(j,0,lenb-1)if(p+j>=len||s[p+j]!=b[j]){fg=0;break;} 95 ans+=fg; 96 } 97 } 98 printf("Case #%d: %d\n",++cas,ans); 99 } 100 return 0; 101 }
View Code
转载于:https://www.cnblogs.com/bin-gege/p/6361539.html
hdu 4125 Moles(kmp+树状数组)相关推荐
- HDU 4125 Moles 二叉排序树 树状数组 kmp
题目链接 题意 将一串数( n≤1e6 n\leq 1e6)依次插入到一棵二叉排序树中, dfs dfs一遍,将经过的每个节点的信息加到一个串尾(如果当前节点为奇数则加 ′1′ '1'否则加 ′0′ ...
- HDU ACM 4031 Attack (树状数组--单点查询+区间更新)
http://acm.hdu.edu.cn/showproblem.php?pid=4031 用了树状数组的区间更新 单点查找(一般为单点更新 区间查找) 例如 区间(2,4)加1 则Updata(2 ...
- poj 3167(KMP+树状数组)
之前自己在做题的时候在网上找别人的题解,虽然当时理解,但时间一久就忘了.所以开个这个东西来记录自己的学习进程,方便自己的回顾,以及给他人提供题解. 开始冲击明年高二的省选!不再颓废! 好了,下面进入正 ...
- hdu 1892二维树状数组
这题我知道是用树状数组,可是好久没打树状数组了,就想用普通方法水过去~~结果--结果--水了好多方法都水不过,出题人真狠呐--我的水方法是对于每一次查询,初始化ans=(x2-x1+1)*(y2-y1 ...
- hdu 4417 Super Mario 树状数组||主席树
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Prob ...
- HDU 1556 前缀和 树状数组 线段树
解法一: a[i]表示以 i作为起点,对 i-n的气球全部上色的次数 对(start,end)区间上色 ++a[start] --a[end+1]抵消掉 end+1-n的部分 问题转换为求 a的前缀 ...
- HDU - 5775 Bubble Sort(树状数组)
题目链接:点击查看 题目大意:给出n个数,求出按照冒泡排序期间每个数可以到达的最右边位置和最左边位置的差 题目分析:其实这个题想明白了就很简单了,先用辅助数组a按照顺序存储每一个数,a[i]就代表排序 ...
- HDU 4777 Rabbit Kingdom 树状数组
分析:找到每一个点的左边离他最近的不互质数,记录下标(L数组),右边一样如此(R数组),预处理 这个过程需要分解质因数O(n*sqrt(n)) 然后离线,按照区间右端点排序 然后扫一遍,对于当前拍好顺 ...
- hdu 4267 多维树状数组
题意:有一个序列 "1 a b k c" means adding c to each of Ai which satisfies a <= i <= b and (i ...
最新文章
- python使用imbalanced-learn的KMeansSMOTE方法进行上采样处理数据不平衡问题
- Reactor/Proactor的比较 (ZZ)
- barrier linux,Linux系统上启用barrier?
- let/var——事实上var的设计可以看成JavaScript语言设计上的错误. 但是这种错误多半不能修复和移除, 以为需要向后兼容.||将let看成更完美的var
- MySQL数据类型合集
- 常用的函数式接口_Predicate接口
- python工作目录_如何使用python 3获取当前工作目录?
- 五年级信息技术上册教案计算机主机探秘,第1课信息与信息技术探秘教案
- js给百度地图上的圆点加自定义动画_three.js实现建筑物纹理流动
- swagger的使用方式
- android 创建图片,[Android]创建图片
- Minimum edit distance(levenshtein distance)(最小编辑距离)初探
- 基于VHDL语言的一位全加器
- linux系统 安卓系统安装教程,在Linux系统上安装Android 4.4图文教程
- 凯撒密码加密算法python_信息安全与密码学的关系
- 关于电源线 USB台灯3C认证相关介绍
- 今晚7:30|AI TIME青年学者——英国伯明翰大学计算机学院讲师来啦!
- 保龄球计分c语言程序,求C语言代码解释(保龄球记分程序)
- Spring Microservices in Action中文版
- 初学01-夜神模拟器连接Android Studio