Map Sum Pairs

medium trie design

Problem

insert(key, val) and sum(prefix) returns the sum of all values whose keys start with prefix.

Inputinsert('apple',3); sum('ap'); insert('app',2); sum('ap')
Output3 then 5
Cumulative prefix sums.

class MapSum:
    def __init__(self): self.root = {}; self.vals = {}
    def insert(self, key, val):
        delta = val - self.vals.get(key, 0); self.vals[key] = val
        node = self.root
        for c in key: node = node.setdefault(c, {}); node['#'] = node.get('#', 0) + delta
    def sum(self, prefix):
        node = self.root
        for c in prefix:
            if c not in node: return 0
            node = node[c]
        return node.get('#', 0)
class MapSum {
  constructor() { this.root = {}; this.vals = new Map(); }
  insert(key, val) {
    const delta = val - (this.vals.get(key) || 0); this.vals.set(key, val);
    let node = this.root;
    for (const c of key) { node = node[c] ||= {}; node['#'] = (node['#'] || 0) + delta; }
  }
  sum(prefix) {
    let node = this.root;
    for (const c of prefix) { if (!node[c]) return 0; node = node[c]; }
    return node['#'] || 0;
  }
}
class MapSum {
    Map vals = new HashMap<>();
    Map sums = new HashMap<>();
    public void insert(String key, int val) {
        int delta = val - vals.getOrDefault(key, 0); vals.put(key, val);
        for (int i = 1; i <= key.length(); i++) sums.merge(key.substring(0, i), delta, Integer::sum);
    }
    public int sum(String prefix) { return sums.getOrDefault(prefix, 0); }
}
class MapSum {
    unordered_map vals, sums;
public:
    void insert(string key, int val) {
        int delta = val - vals[key]; vals[key] = val;
        for (int i = 1; i <= (int)key.size(); i++) sums[key.substr(0, i)] += delta;
    }
    int sum(string prefix) { return sums[prefix]; }
};
Time: O(L) Space: O(N·L)