#include #include #include #include #include using namespace std; #define NMAX 1111 int A[NMAX], N; void ReadInput() { scanf("%d", &N); for (int i = 1; i <= N; i++) scanf("%d", &A[i]); } char marked[NMAX]; map> poz; set used; set> intv; int cans; void SplitInterval(int p) { marked[p] = 1; pair psrc; psrc.first = p; psrc.second = -1; auto it = intv.lower_bound(psrc); int left = it->second, right = it->first; int len = right - left + 1; intv.erase(it); cans -= len * (len + 1) / 2; if (left < p) { intv.insert(make_pair(p - 1, left)); len = p - left; cans += len * (len + 1) / 2; } if (p < right) { intv.insert(make_pair(right, p + 1)); len = right - p; cans += len * (len + 1) / 2; } } long long Solve() { poz.clear(); for (int i = 1; i <= N; i++) poz[A[i]].push_back(i); long long ans = 0; for (int i = 1; i < N; i++) { int len = N - i + 1; cans = len * (len + 1) / 2; used.clear(); intv.clear(); intv.insert(make_pair(N, i)); memset(marked, 0, sizeof(marked)); for (int j = i; j < N; j++) { if (!marked[j]) SplitInterval(j); if (used.find(A[j]) == used.end()) { const vector& vpoz = poz[A[j]]; for (const auto& cpoz : vpoz) { if (cpoz <= j) continue; SplitInterval(cpoz); } used.insert(A[j]); } ans += cans; } } return ans; } int main() { // freopen("x.txt", "r", stdin); int T; scanf("%d", &T); while (T--) { ReadInput(); printf("%lld\n", Solve()); } return 0; }