Cod sursa(job #2731128)

Utilizator CiboAndreiAndrei Cibo CiboAndrei Data 27 martie 2021 12:52:20
Problema Pairs Scor 0
Compilator cpp-64 Status done
Runda simulare_oni_cex Marime 2.5 kb
#include <bits/stdc++.h>

using namespace std;

//ifstream f("date.in");
//ofstream g("date.out");
#define f cin
#define g cout

const int dim = 2e5 + 2;
const int mod = 1e9 + 7;

int n, t, p, k;

bitset <22> v[dim];

void read(){
    f >> n >> k;

    char c;
    for(int i = 1; i <= n; ++i){
        for(int j = 0; j < k; ++j){
            f >> c;
            v[i][j] = c - '0';
        }
    }
}

void solve1(){
    bitset <22> aux = v[1];
    int nr = 0;

    for(int i = 2; i <= n; ++i){
        aux |= v[i];

        if(aux.count() == k){
            ++nr;
            aux = {};
        }
    }

    if(aux.count() == k)
        ++nr;

    g << nr << '\n';
}

vector < vector <int> > poz;

void solve2(){
    vector <int> aux(k + 1, 0);

    for(int i = 1; i <= n; ++i){
        bool ok = 1;

        for(int j = 0; j < k; ++j){
            aux[j] += v[i][j];
            if(aux[j] == 0)
                ok = 0;
        }

        if(ok){
            aux[k] = i;
            poz.push_back(aux);
            aux.assign(k + 1, 0);
        }
    }

    for(int i = 0; i <= k; ++i)
        poz[poz.size() - 1][i] += aux[i];
/*
    for(auto it: poz){
        for(int it2: it)
            g << it2 << " ";
        g << '\n';
    }
*/
    long long ans = 1;
    long long nr = 1;

    for(int i = 1; i < poz.size(); ++i){
        nr = 1;

        for(int j = poz[i - 1].back() + 1; j < n; ++j){
            int o;
            for(o = 0; o < k; ++o){
                poz[i][o] -= v[j][o];
                if(poz[i][o] == 0)
                    break;
            }

            if(o == k){
                ++nr;
                if(i < poz.size() - 1)
                    for(o = 0; o < k; ++o){
                        poz[i + 1][o] += v[j][o];
                    }
            } else {
                ans = (ans * nr) % mod;
                nr = 1;
                break;
            }
        }
    }

    ans = (ans * nr) % mod;
    g << ans << '\n';
}

void restart(){
    for(int i = 1; i <= n; ++i)
        v[i] = {};
    poz.clear();
}

void nos(){
    ios :: sync_with_stdio(false);
    cin.tie(NULL);
}

int main(){
    nos();

    f >> p >> t;

    for(int i = 1; i <= t; ++i){
        read();
        switch(p){
            case 1:
                solve1();
                break;
            case 2:
                solve2();
                break;
        }

        restart();
    }

    return 0;
}