C. Beautiful Triple Pairs
思路
用哈希表,将每三个数字中 任意两个数字存储起来,公式H=a*p+a,用一个数字来代表两个数
p取1000005
要么1 2同 要么1 3 同 要么2 3 同,不可能1 2 3 都同,所以
res+=map[a[i-1]*p+a[i]]++ (这样依次加三次)则这么加三次
有三个数字相同,则做减法*3 ,因为不满足条件同时会 加上三次
代码(注意运算一定要开LL)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 1000005;
const ll p = N;
ll a[N];
int main()
{
int t;
cin >> t;
while (t--)
{
map<ll, int> Hash[4];
ll res = 0;
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
for (int i = 3; i <= n; i++)
{
res += Hash[1][a[i] * p + a[i - 1]]++;
res += Hash[2][a[i] * p + a[i - 2]]++;
res += Hash[3][a[i - 1] * p + a[i - 2]]++;
res -= (Hash[0][a[i] * p * p + a[i - 1] * p + a[i - 2]]++) * 3;
// cout << res < " ";zzz
}
cout << res << endl;
}
}