← Home
```go
package main

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

type FastScanner struct {
	r *bufio.Reader
}

func NewFastScanner() *FastScanner {
	return &FastScanner{r: bufio.NewReaderSize(os.Stdin, 1<<20)}
}

func (fs *FastScanner) NextInt() int {
	sign := 1
	val := 0
	b, _ := fs.r.ReadByte()
	for (b < '0' || b > '9') && b != '-' {
		b, _ = fs.r.ReadByte()
	}
	if b == '-' {
		sign = -1
		b, _ = fs.r.ReadByte()
	}
	for b >= '0' && b <= '9' {
		val = val*10 + int(b-'0')
		b, _ = fs.r.ReadByte()
	}
	return sign * val
}

type Key struct {
	h1 int64
	h2 int64
	l  int
}

var (
	mod1 int64 = 1000000007
	mod2 int64 = 1000000009
	base int64 = 911382323
	add  int64 = 1000003

	pow1  = []int64{1}
	pow2  = []int64{1}
	invB1 int64
	invB2 int64
)

func powmod(a, e, m int64) int64 {
	res := int64(1)
	a %= m
	for e > 0 {
		if e&1 == 1 {
			res = (res * a) % m
		}
		a = (a * a) % m
		e >>= 1
	}
	return res
}

func ensurePow(k int) {
	for len(pow1) <= k {
		pow1 = append(pow1, (pow1[len(pow1)-1]*base)%mod1)
		pow2 = append(pow2, (pow2[len(pow2)-1]*base)%mod2)
	}
}

func main() {
	in := NewFastScanner()
	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	defer out.Flush()

	invB1 = powmod(base%mod1, mod1-2, mod1)
	invB2 = powmod(base%mod2, mod2-2, mod2)

	q := in.NextInt()
	for ; q > 0; q-- {
		n := in.NextInt()
		st := make([]int, 0, n)
		var h1, h2, rh1, rh2 int64
		L := 0
		cnt := make(map[Key]int64)
		cnt[Key{0, 0, 0}] = 1
		var ans int64

		for i := 0; i < n; i++ {
			x := in.NextInt()
			v := int64(x) + add
			if L > 0 && st[len(st)-1] == x {
				L--
				st = st[:len(st)-1]
				ensurePow(L)
				t1 := (v * pow1[L]) % mod1
				t2 := (v * pow2[L]) % mod2
				h1 -= t1
				if h1 < 0 {
					h1 += mod1
				}
				h2 -= t2
				if h2 < 0 {
					h2 += mod2
				}
				rh1 -= v
				if rh1 < 0 {
					rh1 += mod1
				}
				rh1 = (rh1 * invB1) % mod1
				rh2 -= v
				if rh2 < 0 {
					rh2 += mod2
				}
				rh2 = (rh2 * invB2) % mod2
			} else {
				ensurePow(L)
				st = append(st, x)
				t1 := (v * pow1[L]) % mod1
				t2 := (v * pow2[L]) % mod2
				h1 += t1
				if h1 >= mod1 {
					h1 -= mod1
				}
				h2 += t2
				if h2 >= mod2 {
					h2 -= mod2
				}
				rh1 = (rh1*base + v) % mod1
				rh2 = (rh2*base + v) % mod2
				L++
			}

			krev := Key{rh1, rh2, L}
			ans += cnt[krev]
			kfwd := Key{h1, h2, L}
			cnt[kfwd]++
		}
		fmt.Fprintln(out, ans)
	}
}
```