康托展开模板
本来想用map的,结果清华OJ不让用……遂学康托展开,可以当哈希用。(对有n个数的数组集合进行哈希)
int fac[N];
void init()
{
fac[0]=1;
for(int i=1; i<N; ++i)
fac[i]=fac[i-1]*i;
}
int encode(int* a,int n)
{
int ans=0;
for(int i=1; i<=n; i++)
{
int sum=0;
for(int j=i+1; j<=n; j++)
{
if(cantor[j]<cantor[i])
sum++;
}
ans=ans+(sum*fac[n-i]);
}
ans++;
return ans;
}
cantor数组按顺序赋值即可。