Cod sursa(job #2221873)

Utilizator patcasrarespatcas rares danut patcasrares Data 16 iulie 2018 00:40:05
Problema Nums Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include<fstream>
#include<iostream>
#include<cstring>
#define DN 100005
using namespace std;
ifstream fin("nums.in");
ofstream fout("nums.out");
int n,type,k,l,f,nr;
char a[DN];
struct trie
{
    int dp=0;
    unsigned char viz=0;
    trie *c[10]={0};
};
trie *t=new trie,*r[DN];
int inserare(trie *nod,char *p)
{
    nr++;
    if(!f)
        r[nr]=nod;
    if(*p==0)
    {
        if(nod->viz==0&&f)
        {
            nod->dp++;
            nod->viz=1;
            return 1;
        }
        return 0;
    }
    if(!nod->c[*p-'0'])
        nod->c[*p-'0']=new trie;
    if(inserare(nod->c[*p-'0'],p+1))
    {
        nod->dp++;
        return 1;
    }
}
void solve(trie *nod)
{
    k-=nod->viz;
    if(k==0)
        return;
    for(int i=0;i<10;i++)
        if(nod->c[i])
        {
            if(nod->c[i]->dp>=k)
            {
                fout<<i;
                solve(nod->c[i]);
                break;
            }
            else
                k-=nod->c[i]->dp;
        }
}
int main()
{
    fin>>n;
    for(int i=0;i<DN;i++)
        r[i]=new trie;
    f=1;
    while(n--)
    {
        fin>>type;
        if(type==1)
        {
            fin>>a;
            l=strlen(a);
            inserare(r[l],a);
            continue;
        }
        fin>>k;
        for(int i=1;i<DN;i++)
        {
            if(k<=r[i]->dp)
            {
                l=i;
                break;
            }
            else
                k-=r[i]->dp;
        }
        solve(r[l]);
        fout<<'\n';
    }
}