add go trie code
This commit is contained in:
parent
27f3965fa7
commit
3a330a3912
1 changed files with 88 additions and 0 deletions
88
go/trie.go
Normal file
88
go/trie.go
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"bufio"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type trie struct {
|
||||||
|
nodes map[rune]trie
|
||||||
|
terminal bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func new_trie() trie {
|
||||||
|
return trie{ nodes: map[rune]trie {} }
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t trie)insert(word []rune) trie {
|
||||||
|
if len(word) == 0 {
|
||||||
|
t.terminal = true
|
||||||
|
return t
|
||||||
|
}
|
||||||
|
|
||||||
|
trie, ok := t.nodes[word[0]]
|
||||||
|
|
||||||
|
if ok {
|
||||||
|
t.nodes[word[0]] = trie.insert(word[1:])
|
||||||
|
return t
|
||||||
|
} else {
|
||||||
|
trie := new_trie()
|
||||||
|
trie = trie.insert(word[1:])
|
||||||
|
t.nodes[word[0]] = trie
|
||||||
|
}
|
||||||
|
return t
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *trie)search(word []rune) bool {
|
||||||
|
if len(word) == 0 {
|
||||||
|
return t.terminal
|
||||||
|
}
|
||||||
|
trie, ok := t.nodes[word[0]]
|
||||||
|
return ok && trie.search(word[1:])
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *trie)count_substrings(word []rune) int {
|
||||||
|
return t._count_substrings(word, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *trie)_count_substrings(word []rune, acc int) int {
|
||||||
|
if len(word) == 0 {
|
||||||
|
return acc
|
||||||
|
}
|
||||||
|
|
||||||
|
next, ok := t.nodes[word[0]]
|
||||||
|
if ok {
|
||||||
|
// if we want a word to count as a prefix of itself, remove len clause
|
||||||
|
if next.terminal && len(word) > 1 {
|
||||||
|
acc += 1
|
||||||
|
}
|
||||||
|
return next._count_substrings(word[1:], acc)
|
||||||
|
} else {
|
||||||
|
return acc
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
root := new_trie()
|
||||||
|
reader := bufio.NewReader(os.Stdin)
|
||||||
|
word_list := []string{}
|
||||||
|
for {
|
||||||
|
raw, _, _ := reader.ReadLine()
|
||||||
|
line := string(raw)
|
||||||
|
line = strings.Trim(line, " ")
|
||||||
|
if line == "" {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
root = root.insert([]rune(line))
|
||||||
|
word_list = append(word_list, line)
|
||||||
|
}
|
||||||
|
|
||||||
|
sum := 0
|
||||||
|
for _, word := range word_list {
|
||||||
|
sum += root.count_substrings([]rune(word))
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("total score: ", sum)
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue