Pagini recente » Cod sursa (job #2032481) | Cod sursa (job #100505) | Cod sursa (job #1195832) | Cod sursa (job #50225) | Cod sursa (job #109650)
Cod sursa(job #109650)
#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;
}