leetcode

Solution to some Leetcode problems written in C++
git clone git://git.dimitrijedobrota.com/leetcode.git
Log | Files | Refs | README | LICENSE

0677.cpp (2128B)


0 // Only Trie
1 class MapSum {
2 struct Node {
3 Node(){};
4 Node *children[27] = {nullptr};
5 int &value = reinterpret_cast<int &>(children[0]);
6 int trail = 0;
7 };
9 Node *trie = new Node();
11 public:
12 void insert(const string &key, int val) {
13 Node *prev = trie;
14 for (const char c : key) {
15 const int idx = c & 0x1F;
16 if (!prev->children[idx]) {
17 prev = nullptr;
18 break;
19 };
20 prev = prev->children[idx];
21 }
23 const int diff = prev ? val - prev->value : val;
25 Node *crnt = trie;
26 for (const char c : key) {
27 const int idx = c & 0x1F;
28 crnt->trail += diff;
29 if (!crnt->children[idx]) crnt->children[idx] = new Node();
30 crnt = crnt->children[idx];
31 }
32 crnt->value = val;
33 }
35 int sum(const string &prefix) const {
36 const Node *crnt = trie;
37 for (const char c : prefix) {
38 const int idx = c & 0x1F;
39 if (!crnt->children[idx]) return 0;
40 crnt = crnt->children[idx];
41 }
42 return crnt->value + crnt->trail;
43 }
44 };
46 // Trie + hash map
47 class MapSum {
48 struct Node {
49 Node(){};
50 Node *children[27] = {nullptr};
51 int &value = reinterpret_cast<int &>(children[0]);
52 };
54 Node *trie = new Node();
55 unordered_map<string, int> um;
57 public:
58 void insert(const string &key, int val) {
59 const int diff = val - um[key];
61 Node *crnt = trie;
62 for (const char c : key) {
63 const int idx = c & 0x1F;
64 crnt->value += diff;
65 if (!crnt->children[idx]) crnt->children[idx] = new Node();
66 crnt = crnt->children[idx];
67 }
68 crnt->value += diff;
69 um[key] = val;
70 }
72 int sum(const string &prefix) const {
73 const Node *crnt = trie;
74 for (const char c : prefix) {
75 const int idx = c & 0x1F;
76 if (!crnt->children[idx]) return 0;
77 crnt = crnt->children[idx];
78 }
79 return crnt->value;
80 }
81 };