​https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1280​

把每个数都hash为3^p p为该数去重后是第几大的

一开始智障hash为2^p 2^64直接变为0.。

#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int maxn=5e4+10;

map <ull,ull> mp0,mp1,mp2;
ull ary[maxn],tmp[maxn],pw[maxn],pre[maxn],suf[maxn];
int n,len;

void init()
{
int i;
pw[0]=1;
for(i=1;i<=50000;i++) pw[i]=(ull)(3)*pw[i-1];
}

int main()
{
ull ans;
int i,j;
init();
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%llu",&ary[i]);
tmp[i]=ary[i];
}
sort(tmp+1,tmp+n+1);
len=unique(tmp+1,tmp+n+1)-tmp-1;
for(i=1;i<=n;i++)
{
j=lower_bound(tmp+1,tmp+len+1,ary[i])-tmp;
ary[i]=pw[j];
}
for(i=1;i<=n;i++)
{
pre[i]=pre[i-1];
if(!mp1[ary[i]]) pre[i]+=ary[i],mp1[ary[i]]=1;
}
for(i=n;i>=1;i--)
{
suf[i]=suf[i+1];
if(!mp2[ary[i]]) suf[i]+=ary[i],mp2[ary[i]]=1;
}
for(i=1;i<=n;i++) mp0[pre[i]]++;
ans=0;
for(i=1;i<=n;i++) ans+=mp0[suf[i]];
printf("%llu\n",ans);
return 0;
}