Cod sursă (job #805407)

Utilizator avatar divaddd David Curca divaddd IP ascuns
Problemă Cristela (clasele 9-12) Compilator cpp-32 | 0,95 kb
Rundă Arhiva de probleme Status evaluat
Dată 22 ian. 2025 01:42:22 Scor 0
#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;
}