Pagini recente »
Rating Bogdan Ciobanu (bciobanu)
|
c17_6
|
Atașamentele paginii concurs-cls5-14-12-2019
|
Rating Taga Stefan (stefantaga)
|
Cod sursă (job #800614)
Cod sursă (job
#800614)
#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);
int i = 0, j = (1 << m)-1;
for (; j >= 0; i++, j--)
{
total -= (long long)(A[i] * SoS[j]);
}
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<<getPairs(n,sigma+1);
return 0;
}