找出所有子串中 a [ i ] = = a [ j ] a[i]==a[j] a[i]==a[j]的数量
d
p
[
i
]
dp[i]
dp[i]表示以位置
i
i
i结尾的子串答案总和
d
p
[
i
]
=
d
p
[
i
−
1
]
+
∑
j
(
a
[
j
]
=
=
a
[
i
]
)
dp[i]=dp[i-1]+\sum{j(a[j]==a[i])}
dp[i]=dp[i−1]+∑j(a[j]==a[i])
j
j
j代表可以选的子串左端点范围
数组为
1
e
5
1e5
1e5,答案爆int,使用long long
使用map复杂度为
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 5;
ll dp[maxn];
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
int n, x;
scanf("%d", &n);
map <ll, ll> mp;
ll ans = 0;
for (int i = 1; i <= n; i++)
{
scanf("%d", &x);
dp[i] = dp[i - 1] + mp[x];
ans += dp[i];
mp[x] += i;
}
printf("%lld\n", ans);
}
return 0;
}