易忘写法

由于电脑不常在身边,整理这些易忘用法,以备不时之需。

字典树(此为01Trie)工程写法

    struct Trie {
        int cnt;
        Trie* next[2];
    };
    typedef struct Trie* T;

    T NewTrie() {
        T tmp = (T)malloc(sizeof(Trie));
        tmp->cnt = 0;
        memset(tmp->next, 0, 2*sizeof(T));
        return tmp;
    }
    void Insert(T root, int x) {
        T now = root;
        int bit = 0;
        while (x) {
            if (now->next[x & 1] == NULL) {
                now->next[x & 1] = NewTrie();
            }
            now = now->next[x & 1];
            bit++;
            x >>= 1;
        }
        while (bit < 16) {
            if(!now -> next[0]) {
                now->next[0] = NewTrie();
            }
            now = now->next[0];
            bit++;
        }
        now -> cnt++;
    }

01trie数组写法

//leetcode https://leetcode.cn/problems/count-pairs-with-xor-in-a-range/submissions/393158437/
#include<bits/stdc++.h>
using namespace std;

class Solution {
public:
    int search(int trie[],int num,int tgt){
        int p = 1;
        int cnt = 0;
        for (int i=14;i>=0;--i){
            int bit = ((num>>i)&1);
            p = p*2;
            if ((tgt>>i)&1){
                cnt+=trie[p+bit];
            }
            p += (bit^((tgt>>i)&1));
        }
        return cnt;
    }
    int countPairs(vector<int>& nums, int low, int high) {
        int trie[1<<16];
        memset(trie,0,sizeof(trie));
        int ans = 0;
        for (auto &num:nums){
            ans+=search(trie,num,high+1)-search(trie,num,low);
            int p = 1;
            for (int i=14;i>=0;--i){
                p = p*2+((num>>i)&1);
                ++trie[p];
            }
        }
        return ans;
    }
};
/*
处理异或问题的一种数据结构,01trie树,可用树状数组存储。
rt初值赋1,lson = 0son = rt<<1; rson = 1son = (rt<<1) + 1;
*/

 

sort lambda表达式自定义排序

vector<int> cmp;
cmp.push_back(2);
cmp.push_back(3);
sort(ve.begin(), ve.end(), [&](const vector<int> &va, const vector<int> &vb){
    for (auto x : cmp) {
        if (va[x] != vb[x]) {
            return va[x] < vb[x];
        }
    }
    return va[0] < vb[0];
});
/*
[&] 捕获的元素中,包括cmp
按照 va[2] < va[2] 排序
在按照 va[3] < vb[3] 排序
如果都失效,按照 va[0] < vb[0] 排序
输入ve:
5 5 5 5 5
1 2 4 4 3
6 6 3 3 2
0 0 3 2 1
排序后输出:

0 0 3 2 1 
6 6 3 3 2
1 2 4 4 3
5 5 5 5 5
*/
sort_with_lambda

 

结构体构造函数

struct poi {
    int x, y, z;
    poi();
    poi(int x, int y, int z) {
        this->x = x;
        this->y = y;
        this->z = z;
    }
};
// 用法举例:(que为优先队列)
que.push(poi(sx, sy, sz));

 

posted @ 2023-03-04 15:42  joy_gg  阅读(20)  评论(0编辑  收藏  举报