Pagini recente »
Cod sursă (job #805407)
Cod sursă (job
#805407)
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int NMAX = 5e5+2;
const int MMAX = 20;
int n,m,vf[(1<<MMAX)],dp[(1<<MMAX)];
ifstream fin("cristela.in");
ofstream fout("cristela.out")
int gauss(int n){
return n*(n-1)/2;
}
signed main() {
fin >> n;
m = 0;
for(int i = 1; i <= n; i++){
string str;
fin >> str;
int rep = 0;
for(char ch: str){
rep |= (1<<(ch-'a'));
m = max(m, 1ll*ch-'a');
}
vf[rep]++;
}
m++;
for(int i = 0; i < (1<<m); i++){
dp[i] = vf[i];
}
for(int i = 0; i < m; i++){
for(int mask = 0; mask < (1<<m); mask++){
if(mask&(1<<i)){
dp[mask^(1<<i)] += dp[mask];
}
}
}
int ans = 0;
for(int mask = 1; mask < (1<<m); mask++){
if(dp[mask] == 0){
continue ;
}
int coef = (__builtin_popcount(mask)&1) ? 1 : -1;
ans += coef * gauss(dp[mask]);
}
fout << ans;
return 0;
}