- B1: 前缀和与差分
- B2: 快速组合
- B3: 二分查找
- B4: 高精度加法
- B4: 高精度除法
- B4: 高精度乘法
- B4: 高精度减法
- D1: 单调栈
- D2: 单调队列
- D3: Spare Table
- D4: 字典树
- D5: 并查集
- D6: 树状数组-限定区间计数
- D6: 树状数组-单点更新区间求和
- D7: 线段树-基础
- G1: 二分图-判定
- G2: 二分图-最大匹配
- G3: Astar k短路 on matrix
- G4: 拓扑排序
- G5: 连通无环无向图的重心
- G6: MST-Kruskal
- G7: MST-Prim
- G8: ShortestPath-BellmanFord
- G9: ShortestPath-Dijkstra
- G9: ShortestPath-Dijkstra Heap OPT
- G10: ShortestPath-SPFA
- G11: ShortestPath-Floyd
- M1: 快速幂与龟速乘
- M2: 欧几里得-最大公约数
- M2: EX欧几里得-翡蜀定理
- M2: EX欧几里得-线性同余方程
- M2: EX欧几里得-乘法逆元
- M3: 费马小定理-乘法逆元
- M4: 分解质因数
- M4: 分解质因数-欧拉函数
- M4: 分解质因数-多数乘积约数计数
- M4: 分解质因数-多数乘积约数求和
- M5: 欧拉筛
- M5: 欧拉筛-质数筛
- M6: 埃氏筛-质数筛
- M7: Stein算法-最大公约数
- M8: 矩阵乘法与快速幂
- O1: 快速排序
- O2: 并归排序
- S1: KMP
- S2: 字符串哈希
Examples
单词计数
class trietree {
int ar[maxn + 1][26] {};
int cnt[maxn + 1] {};
int idx = 1;
public:
void insert(string &s) {
static int cur;
cur = 0;
for (int c : s) {
c -= 'a';
if (!ar[cur][c]) ar[cur][c] = idx++;
cur = ar[cur][c];
}
++cnt[cur];
}
int query(string &s) {
static int cur;
cur = 0;
for (int c : s) {
c -= 'a';
if (!ar[cur][c]) return 0;
cur = ar[cur][c];
}
return cnt[cur];
}
} trie;
最大抑或树
int ar[maxlen];
class trietree {
int ar[maxn][2] {};
int idx = 1;
public:
void insert(int x) {
for (int i = 30, u, cur = 0; i >= 0; --i) {
u = (x >> i) & 1u;
if (!ar[cur][u]) ar[cur][u] = idx++;
cur = ar[cur][u];
}
}
int query(int x) {
int ret = 0;
for (int i = 30, u, cur = 0; i >= 0; --i) {
u = 1 - ((x >> i) & 1u);
if (ar[cur][u]) cur = ar[cur][u], ret |= 1u << i;
else cur = ar[cur][1 - u];
}
return ret;
}
} trie;
Usage
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> ar[i];
trie.insert(ar[i]);
}
int ret = 0;
for (int i = 0; i < n; i++) ret = max(ret, trie.query(ar[i]));
printf("%d\n", ret);