题目描述:
给你一个长度为n的数组a,请你求出所有三元组
[
a
j
,
a
j
+
1
,
a
j
+
2
]
[a_j,a_{j+1},a_{j+2}]
[aj,aj+1,aj+2]中完美三元组的对数
设有三元组
b
,
c
完美三元组的定义
:
满足其中一个即可
1.
b
1
≠
c
1
和
b
2
=
c
2
和
b
3
=
c
3
2.
b
1
=
c
1
和
b
2
≠
c
2
和
b
3
=
c
3
3.
b
1
=
c
1
和
b
2
=
c
2
和
b
3
≠
c
3
设有三元组b,c\\ 完美三元组的定义: 满足其中一个即可\\ 1.b_1\neq c_1 和 b_2 = c_2 和 b_3=c_3\\ 2.b_1= c_1 和 b_2 \neq c_2 和 b_3=c_3\\ 3.b_1=c_1 和 b_2 = c_2 和 b_3 \neq c_3\\
设有三元组b,c完美三元组的定义:满足其中一个即可1.b1=c1和b2=c2和b3=c32.b1=c1和b2=c2和b3=c33.b1=c1和b2=c2和b3=c3
思路:
哈希记录一下就行了 哈希记录一下就行了 哈希记录一下就行了
代码:
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
int t;
int main(){
cin >> t;
while(t--){
int n;cin >> n;
vector<int> a(n,0);
for(int i=0;i<n;i++) cin >> a[i];
map<array<int,3>,int> cnt;//建立三元组哈希
ll res=0;
for(int i=0;i<n-2;i++){
//记录此时的三元组
array<int,3> th={a[i],a[i+1],a[i+2]};
//考虑所有可能相同的情况
vector<array<int,3>> list={
{0,a[i+1],a[i+2]},
{a[i],0,a[i+2]},
{a[i],a[i+1],0}
};
for(auto i:list){
//该三元组对答案的贡献为"该情况的数目"-"和该三元组相同的数目"
res+=cnt[i]-cnt[th];
cnt[i]++;//该情况的数目加一
}
cnt[th]++;//该三元组的数目加一
}
cout << res << endl;
}
return 0;
}