Pagini recente » Cod sursa (job #1439771) | Cod sursa (job #794050) | Cod sursa (job #3217083) | Cod sursa (job #2730019) | Cod sursa (job #2632513)
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
#define MAXLENGTH 100000
ifstream in("nums.in");
ofstream out("nums.out");
struct node{
private:
node*children[10];
bool isEnd;
int digit;
public:
void setEnd(){
isEnd=true;
}
void setChild(int index,node*child){
children[index]=child;
}
node* getChild(int index) const{
return children[index];
}
bool hasChild(int index) const {
return children[index];
}
bool isEnding() const {
return isEnd;
}
int getDigit() const{
return digit;
}
node(int data):isEnd(false),digit(data){
for(int i=0;i<10;i++)
children[i]=nullptr;
}
};
void addString(node*root,const std::string&to_add){
node*current=root;
for(char a:to_add){
int index=a-'0';
if(!current->hasChild(index)){
node*next =new node(index);
current->setChild(index,next);
}
current=current->getChild(index);
}
current->setEnd();
}
void dfs(node*here,string formed){
if(here->isEnding()){
cout<<formed<<endl;
}
for(int i=0;i<10;i++){
if(here->hasChild(i)){
char data='0'+i;
dfs(here->getChild(i),formed+data);
}
}
}
void find(node*here,int&nth,string formed){
if(here->isEnding()){
nth--;
if(nth==0)
out<<formed<<endl;
}
for(int i=0;i<10 &&nth;i++){
if(here->hasChild(i)){
char data='0'+i;
find(here->getChild(i),nth,formed+data);
}
}
}
node*roots[MAXLENGTH+1];
int num_numbers_with_length[MAXLENGTH+1];
void printOrder(node*root,int index){
find(root,index,"");
}
void findNumber(int index){
for(int i=1;i<=MAXLENGTH;i++){
if(num_numbers_with_length[i]>=index){
printOrder(roots[i],index);
break;
}
index-=num_numbers_with_length[i];
}
}
void read(){
for(int i=0;i<MAXLENGTH;i++)
roots[i]=new node(0);
int query_count,type,order;
string aux;
in>>query_count;
for(int i=0;i<query_count;i++){
in>>type;
if(type==1){
in>>aux;
addString(roots[aux.length()],aux);
num_numbers_with_length[aux.length()]++;
}
else{
in>>order;
findNumber(order);
}
}
}
int main(){
read();
return 0;
}