Pagini recente »
Profil CarmenMinca
|
Istoria paginii utilizator/stoianmihnea
|
Istoria paginii utilizator/armeanuprintesa
|
Borderou de evaluare (job #675087)
|
Cod sursă (job #800081)
Cod sursă (job
#800081)
#include <bits/stdc++.h>
using namespace std;
int const MAX=1050000;
int const BIT=20;
int n;
char energy[13];
int per[MAX];
int propag[MAX][BIT+3];
/// propaga la nr asta la bitii activi de la bitul ala in jos
int string_to_bits(char str[]){
int i;
int nr=0;
for(i=0;str[i];++i){
nr|=(1<<(str[i]-'a'));
}
return nr;
}
void add_nr(int nr){
++per[nr];
int i;
for(i=0;i<BIT;++i){
if(nr&(1<<i)){
++per[nr^(1<<i)];
++propag[nr^(1<<i)][i];
}
}
}
void read(){
cin>>n;
int i;
for(i=1;i<=n;++i){
cin>>energy;
int nr=string_to_bits(energy);
add_nr(nr);
}
}
void calc_per(){
int i;
for(i=(1<<BIT)-1;i;--i){
/// e deja calc pt nr asta
/// acm doar propagam
int j;
int sum=0;
for(j=BIT-1;j>=0;--j){
sum+=propag[i][j];
if(i&(1<<j)){
per[i^(1<<j)]+=sum;
propag[i^(1<<j)][j]+=sum;
}
}
}
}
long long solve(){
long long rez=0;
int i;
for(i=1;i<(1<<BIT);++i){
int nrelem=per[i];
rez-=mobius[i]*1LL*nrelem*(nrelem-1)/2;
}
return rez;
}
void write(long long ans){
cout<<ans;
}
int main()
{
read();
calc_per();
calc_mobius();
write(solve());
return 0;
}