143. 最大异或对 - AcWing题库
#include#include using namespace std; const int N = 100010, M = 3100010; int n; int a[N], son[M][2], idx; void insert(int x) { int p = 0; for (int i = 31; i >= 0; i -- ) { int &s = son[p][x >> i & 1]; if (!s) s = ++ idx; p = s; } } //建树 int search(int x) { int p = 0, res = 0; for (int i = 31; i >= 0; i -- ) { int s = x >> i & 1; if (son[p][!s]) { res += 1 << i; p = son[p][!s]; } else p = son[p][s]; } return res; } //查树 int main() { scanf("%d", &n); for (int i = 0; i < n; i ++ ) { scanf("%d", &a[i]); insert(a[i]); } int res = 0; for (int i = 0; i < n; i ++ ) res = max(res, search(a[i])); printf("%dn", res); return 0; }
1
0 1
0 1 0 1
存储起来
O(nlogn)
1,贪心
2, 树
3,暴力
AcWing 835. Trie字符串统计
#includeusing namespace std; const int N = 100010; int son[N][26], cnt[N], idx; char str[N]; void insert(char *str) { int p = 0; for (int i = 0; str[i]; i ++ ) { int u = str[i] - 'a'; if (!son[p][u]) son[p][u] = ++ idx; p = son[p][u]; } cnt[p] ++ ; } int query(char *str) { int p = 0; for (int i = 0; str[i]; i ++ ) { int u = str[i] - 'a'; if (!son[p][u]) return 0; p = son[p][u]; } return cnt[p]; } int main() { int n; scanf("%d", &n); while (n -- ) { char op[2]; scanf("%s%s", op, str); if (*op == 'I') insert(str); else printf("%dn", query(str)); } return 0; } 作者:yxc 链接:https://www.acwing.com/activity/content/code/content/45282/ 来源:AcWing 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。



