Cod sursa(job #2632513)

Utilizator ViAlexVisan Alexandru ViAlex Data 3 iulie 2020 16:57:05
Problema Nums Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.03 kb
#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;
}