Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int nnode, root, node[2][mx*55], isword[mx*55], cnt[2][mx*55];
- int ara[mx], cua[mx];
- void inittrie(){
- root = 0;
- nnode = 0;
- for(int i=0;i<2;i++){
- node[i][root] = -1;
- cnt[i][root] = 0;
- }
- memset(isword, 0, sizeof isword);
- }
- void inserttrie(int a){
- int now = root;
- for(int i=54;i>=0;i--){
- if(node[(bool)((1LL<<i)&a)][now] == -1){
- node[(bool)((1LL<<i)&a)][now] = ++nnode;
- for(int j=0;j<2;j++){
- node[j][nnode] = -1;
- cnt[j][nnode] = 0;
- }
- }
- cnt[(bool)((1LL<<i)&a)][now]++;
- now = node[(bool)((1LL<<i)&a)][now];
- }
- isword[now] = 1;
- }
- void deltrie(int a){
- int now = root;
- for(int i=54;i>=0;i--){
- cnt[(bool)((1LL<<i)&a)][now]--;
- now = node[(bool)((1LL<<i)&a)][now];
- }
- }
- int findtrie(int a){
- int ans = 0;
- int now = root;
- for(int i=54;i>=0;i--){
- int b = (bool)((1LL<<i)&a);
- if(cnt[1-b][now]==0){
- now = node[b][now];
- if(b) ans |= (1LL<<i);
- }
- else{
- now = node[1-b][now];
- if(1-b) ans |= (1LL<<i);
- }
- }
- return ans;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement