字典树模板

    xiaoxiao2021-03-25  131

    这个字典树的模板就是

    #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int N = 2e5 + 10; int lmax = 35 , tail = 0; int trie[32 * N][2] , s[40] , number[32 * N] , d[40]; void Insert()//插入 { int p = 0; for(int i = lmax ; i >= 1 ; i--){ int x = s[i]; if(trie[p][x] == 0) trie[p][x] = ++tail;//tail表示每一个节点都有一个标记值,然后这个x指向当前字典目录是什么,p表示x的父亲是节点值 p = trie[p][x] , number[p]++; } } void Add(int x) { int l = 0; while(l <= lmax) s[++l] = x % 2 , x /= 2; Insert(); } void Delete() { int p = 0; for(int i = lmax ; i >= 1 ; i--){ int x = s[i]; p = trie[p][x] , number[p]--; } } void Era(int x) { int l = 0; while(l <= lmax) s[++l] = x % 2 , x /= 2; Delete(); } void Xor() { int p = 0 , cnt = 0; for(int i = lmax ; i >= 1 ; i--){ int x = s[i]; if(number[trie[p][1 ^ x]] > 0) p = trie[p][1 ^ x] , d[++cnt] = 1; else p = trie[p][0 ^ x] , d[++cnt] = 0; } int sum = 0; for(int i = 1 ; i <= cnt ; i++) sum = sum*2 + d[i]; printf("%d\n",sum); } void solve(int x) { int l = 0; while(l <= lmax) s[++l] = x % 2 , x /= 2; Xor(); } int main() { int n; Add(0); scanf("%d",&n); for(int i = 1 ; i <= n ; i++){ int x; char button[3]; scanf("%s %d",button , &x); if(button[0] == '+') Add(x); else if(button[0] == '-') Era(x); else{ solve(x); } } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-11284.html

    最新回复(0)