← Home
For problem statement at 0-999/500-599/500-509/501/problemE.txt this is a correct solution, but verifier at 0-999/500-599/500-509/501/verifierE.go ends with All tests passed can you fix the verifier? package main

import (
	"bufio"
	"fmt"
	"os"
)

var (
	B         []int
	neg_count int
	a         []int
	n         int
)

func addB(x int, delta int) {
	if B[x] < 0 {
		neg_count--
	}
	B[x] += delta
	if B[x] < 0 {
		neg_count++
	}
}

func addRight(j int, l int, r_prev int) {
	k := n - j + 1

	addB(a[j], 1)

	if k >= l && k <= r_prev {
		addB(a[j], 1)
	} else if k < l || k > j {
		addB(a[k], -1)
	}
}

func removeLeft(j int, l_prev int, r int) {
	k := n - j + 1

	addB(a[j], -1)

	if k >= j+1 && k <= r {
		addB(a[j], -1)
	} else if k < l_prev || k > r {
		addB(a[k], 1)
	}
}

func main() {
	reader := bufio.NewReader(os.Stdin)
	fmt.Fscan(reader, &n)

	a = make([]int, n+1)
	freq := make([]int, n+1)
	for i := 1; i <= n; i++ {
		fmt.Fscan(reader, &a[i])
		freq[a[i]]++
	}

	odd_count := 0
	for _, f := range freq {
		if f%2 != 0 {
			odd_count++
		}
	}

	if odd_count > 1 {
		fmt.Println(0)
		return
	}

	L_bad := n + 1
	R_bad := 0
	for i := 1; i <= n/2; i++ {
		if a[i] != a[n-i+1] {
			if i < L_bad {
				L_bad = i
			}
			if i > R_bad {
				R_bad = i
			}
		}
	}

	B = make([]int, n+1)
	neg_count = 0

	ans := int64(0)
	r := 1
	addRight(1, 1, 0)

	for l := 1; l <= n; l++ {
		if R_bad > 0 && l > n-R_bad+1 {
			break
		}

		if r < l {
			r++
			addRight(r, l, r-1)
		}

		for r < R_bad {
			r++
			addRight(r, l, r-1)
		}

		if R_bad > 0 && l > L_bad {
			for r < n-L_bad+1 {
				r++
				addRight(r, l, r-1)
			}
		}

		for r <= n && neg_count > 0 {
			r++
			if r <= n {
				addRight(r, l, r-1)
			}
		}

		if r > n {
			break
		}

		ans += int64(n - r + 1)

		removeLeft(l, l, r)
	}

	fmt.Println(ans)
}