Pagini recente »
Istoria paginii runda/2019-11-23-clasa-5-tema-14
|
oli_6_2019
|
2019-11-30-clasa-5-tema-15
|
2014-11-11-clasa-8-tema-8
|
Cod sursă (job #800629)
Cod sursă (job
#800629)
#include <fstream>
#include <cstring>
using namespace std;
ifstream cin("cristela.in");
ofstream cout("cristela.out");
long long A[(1<<21)];
long long dp[(1<<21)][21];
long long SoS[(1<<21)];
long long getPairs(int n, int m)
{
long long total = (long long)(n) * (long long)(n - 1);
for (int i=0;i<(1 << m);i++)
{
total -= (long long)(A[i] * SoS[(i^((1 << m)-1))]);
}
return total / 2;
}
int main()
{
int n;
char s[20];
int sigma=0;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>s;
int x=strlen(s);
int nr=0;
for(int j=0;j<x;j++)
{
if(s[j]-'a'>sigma)
sigma=s[j]-'a';
nr=nr|(1<<s[j]-'a');
}
A[nr]++;
}
unsigned long long cnt=0;
/*
for(int i=0;i<(1<<sigma+1);i++)
{
if(A[i])
{
cnt+=A[i]*(A[i]-1)/2;
for(int j=0;j<i;j++)
if(A[j])
{
if(i&j)
cnt+=A[i]*A[j];
}
}
}
*/
for(int mask=0;mask<(1<<sigma+1);mask++)
{
dp[mask][-1]=A[mask];
for(int j=0;j<sigma+1;j++)
{
if(mask&(1<<j))
dp[mask][j]=dp[mask][j-1]+dp[mask^(1<<j)][j-1];
else
dp[mask][j]=dp[mask][j-1];
}
SoS[mask]+=dp[mask][sigma];
}
//cout<<sigma;
cout<<getPairs(n,sigma+1);
return 0;
}