제출 #1303127

#제출 시각아이디문제언어결과실행 시간메모리
1303127Gadir_2880PIN (CEOI10_pin)C++20
60 / 100
44 ms15064 KiB
#include<bits/stdc++.h>
using namespace std;
#define debug(n,m) cout<<"["<<#n<<"]->"<<n<<m
#define int long long
#define all(x) x.begin(),x.end()
#define pb push_back
 
const int N=2e6+5;
const int mod=1e9+7;
const int inf=2e9;

int dp[37][37][37][37];

int pos[256];

void levi() {
  int n,d;
  cin>>n>>d;
  int tim=0;
  for (char c='0';c<='9';++c) {
    pos[c]=tim++;
  } 
  for (char c='a';c<='z';++c) {
    pos[c]=tim++;
  } 
  for (int i=1;i<=n;++i) {
    string s;
    cin>>s;
    for (int j=0;j<16;++j) {
      vector<int> id={36,36,36,36};
      for (int l=0;l<4;++l) {
        if (j&(1<<l)) id[l]=pos[s[l]];
        //debug(pos[s[l]],'\n');
      }
      ++dp[id[0]][id[1]][id[2]][id[3]];
    }
  } 
  d=4-d;
  int res=0;
  for (int i=0;i<16;++i) {
    if (__builtin_popcount(i)!=d) continue;
    vector<int> id;
    for (int j=0;j<4;++j) {
      if (i&(1<<j)) id.pb(j); 
    }
    if (d==0) {
      int cu=dp[36][36][36][36];
      res+=(cu*(cu-1)/2);
      break;
    }
    else if (d==1) {
      for (int c=0;c<tim;++c) {
        vector<int> pu={36,36,36,36};
        pu[id[0]]=c;
        int cu=dp[pu[0]][pu[1]][pu[2]][pu[3]];
        res+=(cu*(cu-1)/2);
      } 
    }
    else if (d==2) {
      for (int c=0;c<tim;++c) {
        for (int c2=0;c2<tim;++c2) {
          vector<int> pu={36,36,36,36};
          pu[id[0]]=c;
          pu[id[1]]=c2;
          int cu=dp[pu[0]][pu[1]][pu[2]][pu[3]];
          res+=(cu*(cu-1)/2);
        } 
      } 
    }
    else if (d==3) {
      for (int c=0;c<tim;++c) {
        for (int c2=0;c2<tim;++c2) {
          for (int c3=0;c3<tim;++c3) {
        vector<int> pu={36,36,36,36};
            pu[id[0]]=c;
            pu[id[1]]=c2;
            pu[id[2]]=c3;
            int cu=dp[pu[0]][pu[1]][pu[2]][pu[3]];
            res+=(cu*(cu-1)/2);
          } 
        } 
      } 
    }
  }
  //debug(res,' ');
  ++d;
   for (int i=0;i<16;++i) {
    if (__builtin_popcount(i)!=d) continue;
    vector<int> id;
    for (int j=0;j<4;++j) {
      if (i&(1<<j)) id.pb(j); 
    }
    if (d==1) {
      for (int c=0;c<tim;++c) {
        vector<int> pu={36,36,36,36};
        pu[id[0]]=c;
        int cu=dp[pu[0]][pu[1]][pu[2]][pu[3]];
        res-=(cu*(cu-1)/2);
      } 
    }
    else if (d==2) {
      for (int c=0;c<tim;++c) {
        for (int c2=0;c2<tim;++c2) {
          vector<int> pu={36,36,36,36};
          pu[id[0]]=c;
          pu[id[1]]=c2;
          int cu=dp[pu[0]][pu[1]][pu[2]][pu[3]];
          res-=2*(cu*(cu-1)/2);
        } 
      } 
    }
    else if (d==3) {
      for (int c=0;c<tim;++c) {
        for (int c2=0;c2<tim;++c2) {
          for (int c3=0;c3<tim;++c3) {
            vector<int> pu={36,36,36,36};
            pu[id[0]]=c;
            pu[id[1]]=c2;
            pu[id[2]]=c3;
            int cu=dp[pu[0]][pu[1]][pu[2]][pu[3]];
            res-=3*(cu*(cu-1)/2);
          } 
        } 
      } 
    }
    else {
      for (int c=0;c<tim;++c) {
        for (int c2=0;c2<tim;++c2) {
          for (int c3=0;c3<tim;++c3) {
            for (int c4=0;c4<tim;++c4) {
              vector<int> pu={36,36,36,36};
              pu[id[0]]=c;
              pu[id[1]]=c2;
              pu[id[3]]=c4;
              pu[id[2]]=c3;
              int cu=dp[pu[0]][pu[1]][pu[2]][pu[3]];
              res-=4*(cu*(cu-1)/2);
            } 
          } 
        } 
      } 
    }
  }
  cout<<res<<'\n';
}

int32_t main() {
  // freopen("sumdiv.in","r",stdin);
  // freopen("sumdiv.out","w",stdout);
  ios_base::sync_with_stdio(0);
  cin.tie(0);int tt=1;//cin>>tt;
  while(tt--)levi();
}
#Verdict Execution timeMemoryGrader output
Fetching results...