Problem:
Search III

Your task is to write a program of a simple dictionary which implements the following instructions:

insert str: insert a string str in to the dictionary

find str: if the distionary contains str, then print 'yes', otherwise print 'no'

Input

In the first line n, the number of instructions is given. In the following n lines, n instructions are given in the above mentioned format.

Output

Print yes or no for each find instruction in a line.

Constraints

A string consists of 'A', 'C', 'G', or 'T'

1 ≤ length of a string ≤ 12

n ≤ 1000000

Sample Input 1

5
insert A
insert T
insert C
find G
find A

Sample Output 1

no
yes

Sample Input 2

13
insert AAA
insert AAC
insert AGA
insert AGG
insert TTT
find AAA
find CCC
find CCC
insert CCC
find CCC
insert T
find TTT
find T

Sample Output 2

yes
no
no
yes
yes
yes

Notes

Template in C

Solution in Go (judge verdict: Time Limit Exceeded)

package main

import (
	"bufio"
	"fmt"
	"math"
	"os"
	"strconv"
)

type hash struct {
	ss [1000000]string
}

func (h *hash) insert(data string) {
	k := toKey(data)
	i := 0
	hValue := h.hash(k, i)
	v := h.ss[hValue]
	for v != "" && v != data {
		i++
		hValue = h.hash(k, i)
		v = h.ss[hValue]
	}
	if h.ss[hValue] == "" {
		h.ss[hValue] = data
	}
}

func (h *hash) search(data string) string {
	k := toKey(data)
	i := 0
	v := h.ss[h.hash(k, i)]
	for v != "" && v != data {
		i++
		v = h.ss[h.hash(k, i)]
	}
	return v
}

func (h *hash) hash(k int, i int) int {
	return int(math.Mod(float64((h.h1(k) + i*h.h2(k))), float64(len(h.ss))))
}

func (h *hash) h1(k int) int {
	return int(math.Mod(float64(k), float64(len(h.ss))))
}

func (h *hash) h2(k int) int {
	return 1 + int(math.Mod(float64(k), float64(len(h.ss)-1)))
}

func toKey(s string) int {
	result := 0
	for _, c := range s {
		switch c {
		case 'A':
			result = result + 1
		case 'C':
			result = result + 2
		case 'G':
			result = result + 3
		case 'T':
			result = result + 4
		default:
		}
	}
	return result
}

func nextInt(sc *bufio.Scanner) int {
	sc.Scan()
	n, err := strconv.Atoi(sc.Text())
	if err != nil {
		panic(err)
	}
	return n
}

func nextStr(sc *bufio.Scanner) string {
	sc.Scan()
	s := sc.Text()
	return s
}

func main() {
	sc := bufio.NewScanner(os.Stdin)
	sc.Split(bufio.ScanWords)

	//results := []string{}
	var h hash

	n := nextInt(sc)
	for n > 0 {
		cmd := nextStr(sc)
		v := nextStr(sc)
		switch cmd {
		case "insert":
			h.insert(v)
		case "find":
			res := h.search(v)
			if v == res {
				//results = append(results, "yes")
				fmt.Println("yes")
			} else {
				//results = append(results, "no")
				fmt.Println("no")
			}
		default:
		}
		n--
	}
	//for _, r := range results {
	//	fmt.Println(r)
	//}
}