Cod sursa(job #2250625)

Utilizator mihai.alphamihai craciun mihai.alpha Data 30 septembrie 2018 15:05:38
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.71 kb
#include <bits/stdc++.h>

using namespace std;

const int sz1 = 1 << 12;

int v[205];
const long long mod = (long long)(1e9 + 7);
int vn[205], sz;
bool fr[12];
bool viz[12];
long long d[sz1][205];

int n, k;

inline long long ver(int f1, int f2, int a, int b, int conf, bool iss)  {
    memset(fr, 0, sizeof fr);
    memset(viz, 0, sizeof viz);
    bool st = 0;
    bool stc = 0;
    sz = 0;
    if(iss)  {
        for(int i = 0;i < k;i++)
            if(conf & (1 << i))
                viz[i + 1] = 1, fr[i + 1] = 1;
    }
    st = stc = 1 - fr[v[a]];
    if(a > b && f1 > f2)
        return 1;
    for(int k = f1;k <= f2;k++)
        vn[++sz] = v[k];
    for(int k = a;k <= b;k++)
        vn[++sz] = v[k];
    for(int i = 1;i <= sz;i++)  {
        if(vn[i] != vn[i - 1])
            st = 1 - st;
        if(viz[vn[i]] == 1 && fr[vn[i]] != st)
            return 0;
        viz[vn[i]] = 1;
        fr[vn[i]] = st;
    }
    if(st == stc)
        return 0;
    return 1;
}

int main()  {
    freopen("wwt.in", "r", stdin);
    freopen("wwt.out", "w", stdout);
    cin >> n >> k;
    for(int i = 1;i <= n;i++)  {
        cin >> v[i];
    }
    long long ans = 0LL;
    int dim = 1 << k;
    dim--;
    for(int i = 0;i < dim;i++)
        d[i][1] = 1;
    for(int i = 2;i <= n;i++)  {
        bool st = 1;
        if(ver(1, 0, 1, i - 1, 0, 0) == 1)  {
            int conf1, conf2;
            conf1 = 0, conf2 = 0;
            for(int j = 1;j < i;j++)  {
                if(v[j] != v[j - 1])
                    st = st - 1;
                if(st)
                    conf1 |= 1 << (v[j] - 1);
                else
                    conf2 |= 1 << (v[j] - 1);
            }
            d[conf1][i]++;
            d[conf2][i]++;
        }
        for(int j = i - 1;j >= 1;j--)  {
                for(int a = 0;a < dim;a++)
                    if(ver(1, 0, i - 1, j + 1, a, 1))  {
                        d[a][i] += d[a][j];
                    }
        }
    }
//    for(int i = 1;i <= n;i++)
//        cerr << d[i] << " ";
    for(int i = 1;i <= n;i++)  {
        int conf11 = 0;
        bool aa = 1;
        int prev = -1;
        for(int j = i + 1;j <= n;j++)  {
            if(v[j] != prev)
                aa = 1 - aa;
            prev = v[j];
            if(aa)
                conf11 |= 1 << (v[j] - 1);
        }
        int conf22 = 0;
        conf22 = (1 << k) - conf11 - 1;
        cerr << conf11 << " " << conf22 << "\n";
        for(int conf = 0;conf < dim;conf++)  {
            ans = (ans + 1LL * (ver(1, 0, i + 1, n, conf11, 1) | ver(1, 0, i + 1, n, conf22, 1)) * d[conf][i]);
            ans %= mod;
        }
    }
    cout << ans;
    return 0;
}