Pagini recente »
Istoria paginii utilizator/rankie
|
Cod sursă (job #786715)
|
Cod sursă (job #285101)
|
Istoria paginii utilizator/flaviadogaru
|
Cod sursă (job #800082)
Cod sursă (job
#800082)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("cristela.in");
ofstream fout("cristela.out");
int const MAX=1050000;
int const BIT=20;
int n;
char energy[13];
char energ[6000000];
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(){
fin>>n;
fin.get();
fin.getline(energ,6000000);
int ind1=0,ind2=0;
int i;
for(i=1;i<=n;++i){
ind2=0;
while(energ[ind1]!=' ' && energ[ind1]){
energy[ind2++]=energ[ind1++];
}
++ind1;
energy[ind2]=0;
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 rez;
void subm(int bit,int cnt,int nr){
if(bit==BIT){
if(nr==0)
return;
int nrelem=per[nr];
if(cnt&1){
rez+=1LL*nrelem*(nrelem-1)/2;
}
else{
rez-=1LL*nrelem*(nrelem-1)/2;
}
}
else{
subm(bit+1,cnt,nr);
subm(bit+1,cnt+1,nr+(1<<bit));
}
}
void write(long long ans){
fout<<ans;
}
int main()
{
ios::sync_with_stdio(0);
fin.tie(0);
fout.tie(0);
read();
calc_per();
subm(0,0,0);
write(rez);
return 0;
}