Pagini recente »
Cod sursă (job #720051)
|
Borderou de evaluare (job #589068)
|
Cod sursă (job #694436)
|
Cod sursă (job #699635)
|
Cod sursă (job #816128)
Cod sursă (job
#816128)
#include "bits/stdc++.h"
#define int long long int
const int M = 20, SIZE = (1 << M);
int f[SIZE], dp_arr[SIZE];
void Solve(){
int n;
std :: cin >> n;
for(int i = 0; i < SIZE; i++){
f[i] = 0;
dp_arr[i] = 0;
}
for(int i = 1; i <= n; i++){
std :: string s;
std :: cin >> s;
int mask = 0;
for(char c : s){
mask |= (1 << (c - 'a'));
}
f[mask]++;
}
for(int mask = 0; mask < SIZE; mask++){
dp_arr[mask] = f[mask];
}
for(int i = 0; i < M; i++){
for(int mask = 0; mask < SIZE; mask++){
if(mask & (1 << i)){
dp_arr[mask] += dp_arr[mask ^ (1 << i)];
}
}
}
int tot = n * (n - 1) / 2, sum = 0;
int full = SIZE - 1;
for(int mask = 0; mask < SIZE; mask++){
sum += f[mask] * dp_arr[full ^ mask];
}
int disjoint = sum / 2;
int ans = tot - disjoint;
std :: cout << ans;
}
signed main(){
std :: ios_base :: sync_with_stdio(false);
std :: cin.tie(0);
freopen("cristela.in", "r", stdin);
freopen("cristela.out", "w", stdout);
Solve();
return 0;
}