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 Scala (judge verdict: Runtime Error)

import scala.io.StdIn.{readInt, readLine}
import scala.reflect.ClassTag
case class Node[A](data: A, var next: Option[Node[A]])
class Dictionary[A](val size: Int)(implicit m: ClassTag[Option[Node[A]]]) {
    val dict: Array[Option[Node[A]]] = m.newArray(size).map(a => None)
    
    def insert(target: A): Unit = {
        val index = target.hashCode % size
        def go(node: Option[Node[A]]): Unit = node match {
            case None => dict(index) = Option(new Node[A](target, None))
            case Some(a) if a.data != target => a.next match {
                case None => a.next = Option(new Node[A](target, None))
                case _ => go(a.next)
            }
            case _ => ()
        }
        go(dict(index))
    }
    def find(target: A): Boolean = {
        val index = target.hashCode % size
        def go(node: Option[Node[A]]): Boolean = node match {
            case None => false
            case Some(a) => if (a.data == target) true else go(a.next)
        }
        go(dict(index))
    }
    override def toString(): String = {
        def nodeToString(node: Option[Node[A]]): String = node match {
            case None => "None"
            case Some(a) => a.data + " -> " + nodeToString(a.next)
        }
        val sb = new StringBuilder()
        (0 until dict.length).foldLeft(sb) {(builder, idx) =>
            builder.append(idx + " : ")
            dict(idx) match {
                case None => builder.append("None")
                case node => builder.append(nodeToString(node))
            }
            builder.append("\n")
        }
        sb.toString
    }
    
}
object Dictionary {
    def apply[A](size: Int): Dictionary[A] = new Dictionary(size)
}
object Main {
    def main(args: Array[String]): Unit = {
        val len = readInt
        val dict = Dictionary[String](len)
        val l = (1 to len).foldLeft(Nil: List[String]) { (list, dummy) => 
            readLine.split(" ") match {
                case Array("insert", v) => dict.insert(v); list
                case Array("find", v) => dict.find(v) match {
                    case true => "yes" :: list
                    case false => "no" :: list
                }
            }
        }
        println(l.reverse.mkString("\n"))
    }
}