← Home
For problem statement at 1000-1999/1200-1299/1280-1289/1286/problemC1.txt this is a correct solution, but verifier at 1000-1999/1200-1299/1280-1289/1286/verifierC1.go ends with case 1 failed: expected tuoprevgz got ? 1 9
exit status 1 can you fix the verifier? ```go
package main

import (
	"fmt"
	"sort"
)

func sortString(s string) string {
	b := []byte(s)
	sort.Slice(b, func(i, j int) bool { return b[i] < b[j] })
	return string(b)
}

func getFreq(s string) map[byte]int {
	f := make(map[byte]int)
	for i := 0; i < len(s); i++ {
		f[s[i]]++
	}
	return f
}

func diffLetter(full, sub map[byte]int) (byte, bool) {
	var let byte
	count := 0
	for c := byte('a'); c <= byte('z'); c++ {
		f := full[c]
		s := sub[c]
		if f != s {
			if f != s+1 {
				return 0, false
			}
			count++
			let = c
		}
	}
	return let, count == 1
}

func recur(m int, norms []string) []string {
	if m == 1 {
		for _, s := range norms {
			if len(s) == 1 {
				return []string{s}
			}
		}
		return nil
	}

	var full_str string
	for _, s := range norms {
		if len(s) == m {
			full_str = s
			break
		}
	}
	full_freq := getFreq(full_str)

	var cands []string
	for _, s := range norms {
		if len(s) == m-1 {
			cands = append(cands, s)
		}
	}
	if len(cands) != 2 {
		return nil
	}

	var possibles []string
	for ch := 0; ch < 2; ch++ {
		left_norm := cands[ch]
		right_norm := cands[1-ch]
		freq_left := getFreq(left_norm)
		s_m, ok := diffLetter(full_freq, freq_left)
		if !ok {
			continue
		}
		freq_right := getFreq(right_norm)
		s_1, ok := diffLetter(full_freq, freq_right)
		if !ok {
			continue
		}

		var filtered []string
		for _, norm := range norms {
			if len(norm) > m-1 {
				continue
			}
			freq_norm := getFreq(norm)
			ok := true
			for c := byte('a'); c <= byte('z'); c++ {
				if freq_norm[c] > freq_left[c] {
					ok = false
					break
				}
			}
			if ok {
				filtered = append(filtered, norm)
			}
		}
		exp := (m - 1) * m / 2
		if len(filtered) != exp {
			continue
		}

		pref_poss := recur(m-1, filtered)
		for _, pref := range pref_poss {
			if pref[0] != s_1 {
				continue
			}
			possibles = append(possibles, pref+string(s_m))
		}
	}
	return possibles
}

func main() {
	var n int
	fmt.Scan(&n)

	fmt.Printf("? 1 %d\n", n)
	var k int
	fmt.Scan(&k)
	norms := make([]string, 0, k)
	for i := 0; i < k; i++ {
		var s string
		fmt.Scan(&s)
		norms = append(norms, sortString(s))
	}

	poss := recur(n, norms)

	if len(poss) == 0 {
		return
	}
	if len(poss) == 1 {
		fmt.Println("! " + poss[0])
		return
	}

	s1 := poss[0]
	s2 := poss[1]
	diff := -1
	for i := 0; i < n; i++ {
		if s1[i] != s2[i] {
			diff = i + 1
			break
		}
	}
	if diff == -1 {
		fmt.Println("! " + s1)
		return
	}

	fmt.Printf("? %d %d\n", diff, diff)
	var kk int
	fmt.Scan(&kk)
	var ch string
	fmt.Scan(&ch)

	if s1[diff-1] == ch[0] {
		fmt.Println("! " + s1)
	} else {
		fmt.Println("! " + s2)
	}
}
```