专栏文章

01字典树+1-1

算法·理论参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mip5t1oq
此快照首次捕获于
2025/12/03 06:38
3 个月前
此快照最后确认于
2025/12/03 06:38
3 个月前
查看原文
CPP
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;

struct Node {
	int son[2], cnt;
} tr[maxn*20];
int idx = 1;

void ins(int &num) {
	int u = 1;
	for (int i = 0; i <= 5; i++) {
		int x = (num >> i) & 1;
		if (!tr[u].son[x])
			tr[u].son[x] = ++idx;
		u = tr[u].son[x];
		tr[u].cnt++;
	}
}

void dfs(int u, int num, int d) {
	if (!u)
		return;
	if (d > 5) {
		cout<<"数字"<<num<<"出现了"<<tr[u].cnt<<"次\n";
		return; 
	}
	for (int i = 0; i < 2; i++)
		dfs(tr[u].son[i], num + i * (1<<d), d+1);
}
// 全局 +1:交换左右儿子,进左儿子 
void plus_one() {
	int u = 1;
	for (int i = 0; i <= 5; i++) {
		swap(tr[u].son[0], tr[u].son[1]);
		u = tr[u].son[0];
		if (!u) return;
	}
}

// 全局 -1
void minus_one() {
	int u = 1;
	for (int i = 0; i <= 5; i++) {
		swap(tr[u].son[0], tr[u].son[1]);
		u = tr[u].son[1];
		if (!u) return;
	}
} 

int op, x;

int main() {
	while (cin >> op) {
		if (op == 1) {
			cin >> x;
			ins(x);
		}
		else if (op == 2) {
			plus_one();
		}
		else if (op == 3) {
			dfs(1, 0, 0);
		}
		else { // op == 4
			minus_one();
		}
	}
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...