Cod sursa(job #109650)

Utilizator mariusdrgdragus marius mariusdrg Data 25 noiembrie 2007 12:15:54
Problema NKPerm Scor 20
Compilator cpp Status done
Runda preONI 2008, Runda 1, Clasele 11-12 Marime 2.17 kb
#include<stdio.h>


const int maxn = 500010;

typedef char sir[22];

sir perm[maxn];
sir a;

int i;
int n;
int k;
int x,p;
int nrp;
int j;
int b[100];
int t;
int c;
int ver[100];


bool cmp(sir &s1,sir &s2)
{
        int i;
        for(i = 1;i <= n * k; ++i)
        {
                if (s1[i] != s2[i]) return s1[i] < s2[i];
        }
        return true;

}

void bkt(int i)
{
        if (i > n * k)
        {
                ++nrp;
                for(j = 1;j < i; ++j)
                {
                        perm[nrp][j] = b[j];
                }
                if (nrp > 500000) return ;
        }
        for(b[i] = 1;b[i] <= n; ++b[i])
        {
                if (b[i - 1] == b[i]) continue;
                if (!ver[b[i]]) continue;
                ver[b[i]]--;
                bkt(i + 1);
                if (nrp > 500000) return ;
                ver[b[i]]++;
        }
}

int main()
{
        freopen("nkperm.in","r",stdin);
        freopen("nkperm.out","w",stdout);
        scanf("%d %d %d\n",&n,&k,&t);

        for(i = 1;i <= n; ++i)
        {
                ver[i] = k;
        }

        bkt(1);

        for(;t; --t)
        {
                scanf("%c",&c);
                if (c == 'A')
                {
                        for(i = 1;i <= n * k; ++i)
                        {
                              scanf("%d",&a[i]);
                        }
                        x = 0;
                        for(p = 1;p <= nrp; p <<= 1);
                        for(;p;p >>= 1)
                        {
                                if (x + p > nrp) continue;
                                if (cmp(perm[x + p],a))
                                {
                                        x += p;
                                }
                        }
                        printf("%d\n",x);
                }
                if (c == 'B')
                {
                        scanf("%d",&x);
                        for(i = 1;i <= n * k; ++i)
                        {
                                printf("%d ",perm[x][i]);
                        }
                        printf("\n");
                }
                scanf("\n");
        }
        return 0;

}