Monday, June 6, 2011

941 - Permutations


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define M 21

long long per[M];

int comp(void*,void*);
void swap(char*,char*);
void Permute(char[],long long,long);

int main()
{
    long T,i,n;
    long long t;
    char str[M];
    freopen("in.txt","r",stdin);
    scanf("%ld",&T);

    per[0] = 1;
    for(i=1;i<M;i++)
        per[i] = per[i-1]*i;

    while(T--)
    {
        scanf("%s%lld",str,&t);
        for(n=0;str[n];n++);

        Permute(str,t,n);
        printf("%s\n",str);
    }
    return 0;
}

int comp(const void* x,const void* y)
{
    return *(char*)x - *(char*)y;
}

void swap(char* x,char* y)
{
    char t;
    t = *x;
    *x = *y;
    *y = t;
}

void Permute(char str[],long long t,long n)
{
    long long d=0,i,tmp;
    qsort(str,n,sizeof(char),comp);
    if(!t)return;

    tmp = 0;
    for(i=0;i<=n&&tmp<=t;)
    {
        d = tmp;i++;
        tmp = per[n-1]*i;
    }

    swap(str,str+i-1);
    Permute(str+1,t-d,n-1);
}

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.