Cod sursa(job #2632543)

Utilizator ViAlexVisan Alexandru ViAlex Data 3 iulie 2020 18:13:01
Problema Nums Scor 65
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2 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;
		char digit;
		int under;
	public:
		void setEnd(){
			isEnd=true;
		}
		void setChild(int index,node*child){
			children[index]=child;
		}
		void incrementUnder(){
			under++;
		}
		int getUnder() const{
			return under;
		}
		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(char data):isEnd(false),digit(data),under(0){
			for(int i=0;i<10;i++)
				children[i]=nullptr;
		}
};


void addString(node*root,const std::string&to_add){
	node*current=root;
	vector<node*>passed;
	for(char a:to_add){
		passed.push_back(current);
		int index=a-'0';
		if(!current->hasChild(index)){
			node*next =new node(a);
			current->setChild(index,next);
		}
		current=current->getChild(index);
	}
	if(!current->isEnding()){
		current->setEnd();
		current->incrementUnder();
		for(node*path:passed){
			path->incrementUnder();
		}
	}
}

node*roots[MAXLENGTH+1];


void findOrder(int index){
	int i=1;
	for(i=1;i<=MAXLENGTH;i++){
		if(roots[i]->getUnder()>=index)
			break;
		index-=roots[i]->getUnder();
	}

	node*current=roots[i];
	string formed;
	while(!current->isEnding()){
		for(int i=0;i<10;i++){
			if(current->hasChild(i)){
				node*child=current->getChild(i);
				if(child->getUnder()>=index){
					current=child;
					formed+=child->getDigit();
					break;
				}
				index-=child->getUnder();
			}
		}
	}
	out<<formed<<'\n';
}
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);
		}
		else{
			in>>order;
			findOrder(order);
		}
	}

}
int main(){

	read();
	return 0;
}