| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 | 
							- type trie struct {
 
- 	freq int
 
- 	word bool
 
- 	next [26]*trie // '26' is quite important!
 
- }
 
- func (t *trie) insert(key string, val int) {
 
- 	res := t.search(key)
 
- 	if res != nil && res.word {
 
- 		val -= res.freq
 
- 	}
 
- 	for _, r := range key {
 
- 		i := r - 'a'
 
- 		if t.next[i] == nil {
 
- 			t.next[i] = &trie{}
 
- 		}
 
- 		t = t.next[i]
 
- 		t.freq += val
 
- 	}
 
- 	t.word = true
 
- }
 
- func (t *trie) search(key string) *trie {
 
- 	for _, r := range key {
 
- 		t = t.next[r-'a']
 
- 		if t == nil {
 
- 			break
 
- 		}
 
- 	}
 
- 	return t
 
- }
 
- type MapSum struct {
 
- 	tree trie
 
- }
 
- /** Initialize your data structure here. */
 
- func Constructor() MapSum {
 
- 	return MapSum{}
 
- }
 
- func (this *MapSum) Insert(key string, val int) {
 
- 	this.tree.insert(key, val)
 
- }
 
- func (this *MapSum) Sum(prefix string) int {
 
- 	res := this.tree.search(prefix)
 
- 	if res == nil {
 
- 		return 0
 
- 	}
 
- 	return res.freq
 
- }
 
- /**
 
-  * Your MapSum object will be instantiated and called as such:
 
-  * obj := Constructor();
 
-  * obj.Insert(key,val);
 
-  * param_2 := obj.Sum(prefix);
 
-  */
 
 
  |