CodeChef May Cook-off 2011 "Popular Rice Recipe"

問題:http://www.codechef.com/COOK10/problems/TIDRICE/

投票回数と投票した人と+/-の表記が与えられる.同じ名前で投票されている場合は最後のものを評価するとき,総合的な投票結果を求める.

コード

package main
 
import (
        "os"
        "bufio"
        "fmt"
        "io"
        "io/ioutil"
        "strconv"
)
 
func run() {
	for t := s.next(); t > 0; t-- {
		v := make(map[string] int)
		for n := s.next(); n > 0; n-- {
			str := s.nextStr()
			if s.nextStr() == "+" {
				v[str] = 1
			}else{
				v[str] = -1;
			}
		}
		r := 0
		for _,v := range v {
			r += v
		}
		s.println(r)
	}
}
 
func main() {
        s = NewInOut(os.Stdin, os.Stdout)
        run()
        s.Flush()
}
 
var (
        s *InOut
)
 
// io start
 
type InOut struct {
        in []byte
        *bufio.Writer
}
 
func NewInOut(r io.Reader, w io.Writer) *InOut {
        in,_ := ioutil.ReadAll(r)
        return &InOut{in, bufio.NewWriter(w)}
}
 
func (s *InOut) next() (r int) {
        buf := s.in
        p := 1
        for (buf[0] < '0' || '9' < buf[0]) && buf[0] != '-' {
                buf = buf[1:]
        }
        if buf[0] == '-' {
                p = -1
                buf = buf[1:]
        }
        for '0' <= buf[0] && buf[0] <= '9' {
                r = 10*r + int(buf[0]-'0')
                buf = buf[1:]
        }
        r *= p
        s.in = buf
        return
}
 
func (s *InOut) nextStr() (r string) {
        buf := s.in
        for buf[0] == '\n' || buf[0] == ' ' {
                buf = buf[1:]
        }
        p := 0
        for buf[p] != '\n' && buf[p] != ' ' {
                p++
        }
        r = string(buf[0:p])
        s.in = buf[p:]
        return
}
 
func (s *InOut) print(o interface{}) {
        switch i := o.(type) {
        case byte:
                s.WriteByte(o.(byte))
        case string:
                s.WriteString(o.(string))
        case int:
                s.WriteString(strconv.Itoa(o.(int)))
        case int64:
                s.WriteString(strconv.Itoa64(o.(int64)))
        }
}
 
func (s *InOut) println(o interface{}) {
        s.print(o)
        s.print("\n")
}
 
func (s *InOut) printlnNow(o interface{}) {
        fmt.Println(o)
}
 
// io end