题目
思路
它是枚举k,然后统计一下k后面的数字出现的次数sum[]
接着从k-1的位置往前枚举,枚举的是 i
如果i和k一样,那就上cnt
这里cnt的含义是i和k中间夹着的配对个数
往前枚举时,不论一不一样,cnt都加上sum[第二个指针(往前移动的)枚举的数字]
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 3e3 + 10;
int a[maxn];
int sum[maxn];
ll ans, n;
void solve(){
ans = 0;
for(int i = 1; i <= n; i++){//枚举第三位
int cnt = 0;
memset(sum, 0, sizeof(sum));
for(int j = i + 1; j <= n; j++){
sum[a[j]]++;
}
for(int j = i - 1; j >= 1; j--){
if(a[i] == a[j]){
ans += cnt;
}
cnt += sum[a[j]];
}
}
}
int main(){
int t; cin >> t;
while(t--){
cin >> n;
for(int i = 1; i <= n; i++)
cin >> a[i];
solve();
printf("%lld\n", ans);
}
return 0;
}