hdu6191(字典树合并)
来源:互联网 发布:小米手机怎么选择网络 编辑:程序博客网 时间:2024/06/16 15:30
字典树合并,记得释放内存
#include <bits/stdc++.h>using namespace std;typedef long long ll;int a[100005];vector<pair<int,int> > que[100005];vector<int> qq[100005];int ans[100005];struct node{ struct node *nxt[2]; node() { nxt[0]=nxt[1]=NULL; }};int bit[33];void add(int x,struct node *u){ int cnt=0; while(x) { bit[cnt++]=x%2; x/=2; } reverse(bit,bit+cnt); for(int i=0;i<31;i++) { int id=i<31-cnt?0:bit[i-31+cnt]; if(!u->nxt[id]) u->nxt[id]=new node(); u=u->nxt[id]; }}struct node *merge(struct node *head,struct node *v){ if(!head) return v; if(!v) return head; head->nxt[0]=merge(head->nxt[0],v->nxt[0]); head->nxt[1]=merge(head->nxt[1],v->nxt[1]); free(v); return head;}int gao(int x,struct node* head){ int cnt=0; while(x) { bit[cnt++]=x%2; x/=2; } reverse(bit,bit+cnt); int ans=0; for(int i=0;i<31;i++) { int id=i<31-cnt?0:bit[i-31+cnt]; if(head->nxt[id^1]) ans=(ans<<1|1),head=head->nxt[id^1]; else ans<<=1,head=head->nxt[id]; } return ans;}struct node* dfs(int u){ struct node *head=new node(); for(int i=0;i<qq[u].size();i++) { struct node* v=dfs(qq[u][i]); merge(head,v); } add(a[u],head); int siz=(int)que[u].size(); for(int i=0;i<siz;i++) { int fi=que[u][i].first,si=que[u][i].second; ans[si]=gao(fi,head); } return head;}void Delete(struct node *rt){ if(rt->nxt[0]) Delete(rt->nxt[0]); if(rt->nxt[1]) Delete(rt->nxt[1]); free(rt);}int main(){ int n,q; while(~scanf("%d%d",&n,&q)) { for(int i=1;i<=n;i++) scanf("%d",&a[i]),qq[i].clear(),que[i].clear(); for(int i=2;i<=n;i++) { int x; scanf("%d",&x); qq[x].push_back(i); } for(int i=1;i<=q;i++) { int u,x; scanf("%d%d",&u,&x); que[u].push_back(make_pair(x,i)); } Delete(dfs(1)); for(int i=1;i<=q;i++) printf("%d\n",ans[i]); }}
阅读全文
0 0
- hdu6191(字典树合并)
- hdu6191 可持久化字典树
- HDU6191(dfs序 + 可持久Trie树)
- [SCU 4494] 双剑合并 (xor字典树)
- HDU6191Query on A Tree(字典树启发式合并)
- Codeforces601D Acyclic Organic Compounds(dfs+字典树合并)
- HDU-6191 01字典树+启发式合并
- Python 中两个字典(dict)合并
- Python 中两个字典(dict)合并
- python中两个字典(dict)合并
- Python日常-两个字典(dict)合并
- Python 中两个字典(dict)合并
- Python 中两个字典(dict)合并
- Python 中两个字典(dict)合并
- hdu 6191 Query on A Tree(字典树启发式合并(动态建树) 可持久化字典树+dfs序)
- Codeforces 601D Acyclic Organic Compounds(dfs+字典树合并)
- HDU 6191 && 2017广西邀请赛:Query on A Tree(字典树启发式合并)
- 2017 广西邀请赛&& hdu 6191 Query on A Tree(字典树启发式合并)
- VS2008 LNK1000链接错误
- 晨光文具去年赚5亿,连2000元都拿来理财
- 共60课:Python基础教程
- AndroidStudio翻译插件:ECTranslation
- 单点登陆(Single Sign On-SSO)
- hdu6191(字典树合并)
- centos 7 edb安装
- 卡特兰数
- 修改Maven本地仓库和eclipse3.6的Maven本地仓库地址
- 使用JQuery中的ajax跨域
- python字符串format中英文空格对齐问题
- redis 简介 使用场景 简单总结
- 设置 SQL 2005 x64 默认端口
- Unity_面试题_084