Submission #1168351

#TimeUsernameProblemLanguageResultExecution timeMemory
1168351Ghulam_Junaid새로운 문제 (POI13_spa)C++20
100 / 100
236 ms55468 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const int N = 61, K = 1e6 + 10;
int n, k, ite[2];
ll X[2];
bool done;
unordered_set<ll> blocked, seen;

int dist(ll u, ll v){
    return __builtin_popcount(u ^ v);
}

void dfs(int id, ll v){
    if (v == X[1 - id]) done = 1;
    if (ite[id] >= 2 * k) return ;
    seen.insert(v);
    ite[id]++;
    for (int i = 0; i < n; i ++){
        ll nv = (1ll << i) ^ v;
        if (seen.find(nv) != seen.end() or blocked.find(nv) != blocked.end()) continue;
        dfs(id, nv);
        if (ite[id] >= (2 * k)) return;
    }
}

int main(){
    ios::sync_with_stdio(0); cin.tie(0);

    cin >> n >> k;
    for (int i = 0; i < 2; i ++){
        for (int j = 0; j < n; j ++){
            char c;
            cin >> c;
            X[i] = X[i] * 2 + (c - '0');
        }
    }
    if (X[0] > X[1]) swap(X[0], X[1]);

    for (int i = 0; i < k; i ++){
        ll cur = 0;
        for (int j = 0; j < n; j ++){
            char c;
            cin >> c;
            cur = cur * 2 + (c - '0');
        }
        blocked.insert(cur);
    }

    if (X[0] == X[1]){
        cout << "TAK" << endl;
        return 0;
    }

    dfs(0, X[0]);
    seen.clear();
    dfs(1, X[1]);

    if (done or (ite[0] >= 2 * k and ite[1] >= 2 * k))
        return cout << "TAK" << endl, 0;
    cout << "NIE" << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...