Pagini recente » Cod sursa (job #578971) | Cod sursa (job #3216546) | Cod sursa (job #111763) | Cod sursa (job #2355034) | Cod sursa (job #678762)
Cod sursa(job #678762)
#include <stdio.h>
#include <string.h>
#define maxN 21
#define maxK 6
#define maxn 101
#define mod 999983
struct hash
{
int nod,val;
hash *link;
}*H[mod];
int v[maxn];
int pre[maxn];
int num[maxN];
int N,K,n;
inline long long con()
{
long long ret=0;
int v[maxK];
memset(v,0,sizeof(v));
for(int i=1;i<=N;++i) ++v[num[i]];
for(int i=1;i<=K;++i)
ret=ret*(N+1)+v[i];
return ret;
}
inline void add(long long e,long long val)
{
hash *p=new hash;
p->nod=e;
p->val=val;
p->link=H[e%mod];
H[e%mod]=p;
}
inline long long find(long long e)
{
for(hash *p=H[e%mod];p;p=p->link)
if(p->nod==e) return p->val;
return -1;
}
inline long long back(int x)
{
long long ret=0,e,ok;
if(x>n) return 1;
for(int i=1;i<=N;++i)
if(i!=pre[x-1]&&num[i]<K)
{
++num[i];
pre[x]=i;
e=con();
ok=find(e);
if(ok==-1)
{
ok=back(x+1);
if(ok)
{
ret+=ok;
add(e,ok);
}
}
else ret+=ok;
--num[i];
}
return ret;
}
int main()
{
int T;
char ch;
long long cnt,sub,e,ok;
freopen("nkperm.in","r",stdin);
scanf("%d %d %d\n",&N,&K,&T);
n=N*K;
freopen("nkperm.out","w",stdout);
while(T--)
{
scanf("%c ",&ch);
if(ch=='A')
{
for(int i=1;i<=n;++i) scanf("%d%c",&v[i],&ch);
cnt=1;
memset(pre,0,sizeof(pre));
memset(num,0,sizeof(num));
for(int i=1;i<=n;++i)
{
for(int j=1;j<v[i];++j)
if(j!=v[i-1]&&num[j]<K)
{
pre[i]=j;
++num[j];
e=con();
ok=find(e);
if(ok==-1)
{
ok=back(i+1);
if(ok)
{
cnt+=ok;
add(e,ok);
}
}
else cnt+=ok;
--num[j];
}
pre[i]=v[i];
++num[v[i]];
}
printf("%lld\n",cnt);
}
else
{
scanf("%lld\n",&cnt);
--cnt;
memset(pre,0,sizeof(pre));
memset(num,0,sizeof(num));
for(int i=1;i<=n;++i)
for(int j=1;j<=N;++j)
if(j!=pre[i-1]&&num[j]<K)
{
++num[j];
pre[i]=j;
sub=back(i+1);
--num[j];
if(sub>cnt)
{
pre[i]=j;
++num[pre[i]];
break;
}
else cnt-=sub;
}
for(int i=1;i<=n;++i) printf("%d ",pre[i]);
printf("\n");
}
}
return 0;
}