易忘写法
由于电脑不常在身边,整理这些易忘用法,以备不时之需。
字典树(此为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 */
结构体构造函数
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));