Cod sursa(job #389879)

Utilizator freak93Adrian Budau freak93 Data 2 februarie 2010 13:38:29
Problema Nums Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include<cstdio>
#include<cstring>

using namespace std;

const char iname[]="nums.in";
const char oname[]="nums.out";
const int maxn=100005;
const int INF=(1<<31)-1;

struct trie
{
    trie* nodes[10];
    int v;
    trie()
    {
        memset(nodes,0,sizeof(nodes));
        v=0;
    }
}* a[maxn];

int i,j,n,k,m,maxt;

char s[maxn];

void update(char *s,int n)
{
    if(a[n]==0)
        a[n]=new trie();
    trie *i;
    for(i=a[n];*s>='0'&&*s<='9';++s)
    {
        ++i->v;
        if(i->nodes[*s-'0']==0)
            i->nodes[*s-'0']=new trie();
        i=i->nodes[*s-'0'];
    }
    i->v=INF;
}

void query(int k)
{
    int i;
    for(i=1;i<=maxt;++i)
        if(a[i])
            if(a[i]->v<k)
                k-=a[i]->v;
            else
                break;
    trie *j;
    for(j=a[i];j->v!=INF;)
    {
        for(i=0;i<10;++i)
            if(j->nodes[i])
                if(j->nodes[i]->v<k)
                    k-=j->nodes[i]->v;
                else
                {
                    j=j->nodes[i],printf("%d",i);
                    break;
                }
    }
    printf("\n");
}
int main()
{
    freopen(iname,"r",stdin);
    freopen(oname,"w",stdout);
    scanf("%d\n",&n);
    for(i=1;i<=n;++i)
    {
        fgets(s,sizeof(s),stdin);
        if(s[0]=='1')
        {
            m=strlen(s);
            if(s[m-1]=='\n')
                s[--m]=0;
            update(s+2,m-2);
            if(m-2>maxt)
                maxt=m-2;
        }
        else
            sscanf(s+2,"%d",&k),query(k);
    }

    fclose(stdin);
    fclose(stdout);

    return 0;
}