Submission #1322800

#TimeUsernameProblemLanguageResultExecution timeMemory
1322800syanvuPIN (CEOI10_pin)C++20
100 / 100
51 ms17764 KiB
// #pragma optimize ("g",on)
// #pragma GCC optimize ("inline")
// #pragma GCC optimize ("Ofast")
// #pragma GCC optimize ("unroll-loops")
// #pragma GCC optimize ("03")
#include <bits/stdc++.h>

#define SS ios_base::sync_with_stdio(0);cin.tie(nullptr);cout.tie(nullptr);
#define int long long
#define all(v) v.begin(),v.end()
using namespace std;
// mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());

const int N = 1e5 + 1, MX = 40, inf = 1e18, p = 11, p1 = 17, mod = 1e9 + 7, mod1 = 998244353;


int cnt[MX][MX][MX][MX] = {};

void solve(){
    int n, d;
    cin >> n >> d;
    int ans = 0;
    auto f = [&](char c){
        if(c >= '0' && c <= '9') return (c - '0' + 1);
        else return (c - 'a' + 11);
    };
    for(int i = 0; i < n; i++){
        string s;
        cin >> s;
        for(int mask = 0; mask < (1ll << 4); mask++){
            int h = 0;
            int ps[4] = {};
            vector<int> v;
            for(int j = 0; j < 4; j++){
                if((mask >> j) & 1){
                    h++;
                    ps[j] = f(s[j]);
                }
                else v.push_back(j);
            }
            if(v.size() != d) continue;
            for(int mask1 = 0; mask1 < (1ll << v.size()); mask1++){
                int ps1[4];
                for(int j = 0; j < 4; j++) ps1[j] = ps[j];
                int b = 0;
                for(int j = 0; j < v.size(); j++){
                    if((mask1 >> j) & 1){
                        ps1[v[j]] = f(s[v[j]]);
                        b++; 
                    }
                }
                if(b % 2 == 0) ans += cnt[ps1[0]][ps1[1]][ps1[2]][ps1[3]];
                else ans -= cnt[ps1[0]][ps1[1]][ps1[2]][ps1[3]];
            }
        }
        for(int mask = 0; mask < (1ll << 4); mask++){
            int ps[4] = {};
            for(int j = 0; j < 4; j++){
                if((mask >> j) & 1){
                    ps[j] = f(s[j]);
                }
            }
            cnt[ps[0]][ps[1]][ps[2]][ps[3]]++;
        }
    }
    cout << ans << '\n';
}

signed main(){
    SS
    // freopen("trains.in", "r", stdin);
    // freopen("trains.out", "w", stdout);

    int t = 1;
    // cin >> t; 
    while(t--){
        solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...