您的位置:首页 > 产品设计 > UI/UE

【UESTC1060/ZCMU1783】秋实大哥与快餐店(字典树)

2016-12-23 14:54 489 查看
记录一个菜逼的成长。。

PS:

一道字典树问题,纯粹考数据结构,涉及建树与匹配。

今年校赛的一道题。。

还好学长队友强,一看就给了思路,然后就由作为主键盘手的我来敲。

用键盘敲的时候有点忐忑,后来用手写了下,就有了信心。

RE了一发,2Y.

———————–分割线————————-

就是把菜的编号转化成21位的二进制数,不够补零。

然后就是插入,节点的值左0右1,根节点不放数。叶子节点放菜的编号。

接着是匹配,因为是按位异或,我们也把客人编号转化成21位二进制数,从末端开始匹配,如果是0(我们需要匹配1)并且右孩子不为-1,就进入右孩子,如果为1(我们需要匹配0)并且左孩子不为-1,就进入左孩子,直到叶子节点,返回值。

具体的看代码实现吧。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <cstdlib>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <list>
#include <deque>
#include <cctype>
#include <bitset>
#include <cmath>
#include <cassert>
using namespace std;
#define ALL(v) (v).begin(),(v).end()
#define cl(a,b) memset(a,b,sizeof(a))
#define bp __builtin_popcount
#define pb push_back
#define mp make_pair
#define fin freopen("D://in.txt","r",stdin)
#define fout freopen("D://out.txt","w",stdout)
#define lson t<<1,l,mid
#define rson t<<1|1,mid+1,r
#define seglen (node[t].r-node[t].l+1)
#define pi 3.1415926
#define exp  2.718281828459
#define lowbit(x) (x)&(-x)
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
typedef pair<LL,LL> PLL;
typedef vector<PII> VPII;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
template <typename T>
inline void read(T &x){
T ans=0;
char last=' ',ch=getchar();
while(ch<'0' || ch>'9')last=ch,ch=getchar();
while(ch>='0' && ch<='9')ans=ans*10+ch-'0',ch=getchar();
if(last=='-')ans=-ans;
x = ans;
}
int bit[25];
int tree[1<<22|100];
int change(int x)
{
int ind = 0;
while(x){
bit[ind++] = x % 2;
x /= 2;
}
for( ; ind < 21; ind++ ){
bit[ind] = 0;
}
return ind;
}
void Insert(int x)
{
int ind = change(x);
int t = 1;
while(ind - 1 >= 0){
if(bit[ind-1] == 0){
t <<= 1;
tree[t] = 0;
}
else {
t = t<<1|1;
tree[t] = 1;
}
if(ind-1 == 0){
tree[t] = x;
return ;
}
ind--;
}
}
int solve(int x)
{
int ind = change(x);
int t = 1;
while(ind-1 >= 0){
if(bit[ind-1] == 0){
t = t<<1|1;
if(tree[t] == -1){
t -= 1;
}
}
else {
t <<= 1;
if(tree[t] == -1){
t += 1;
}
}
if(ind-1 == 0)return tree[t];
ind--;
}
}
int main()
{
int n,m;
while(~scanf("%d",&n)){
cl(tree,-1);
for( int x,i = 0; i < n; i++ ){
scanf("%d",&x);
Insert(x);
}
scanf("%d",&m);
while(m--){
int ope,x;
scanf("%d%d",&ope,&x);
if(!ope){
Insert(x);
}
else {
printf("%d\n",solve(x));
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构 字典树