Untitled

 avatar
unknown
plain_text
2 years ago
3.3 kB
3
Indexable
#include<stdio.h>
#include<unordered_map>
#include<string>

#define MAX_MAKELIST 10
#define MAX_LENGTH 200000
#define MAX_UPDATE 100000
#define MAX_COPY 5000

using namespace std;

/************* The changes *************/
struct Node{
	int index_change;
	int new_value;
	Node* next;
	Node(int idx, int val): index_change(idx), new_value(new_value){};
};
struct List{
	Node* head;
	List():head(NULL){};
	void addFirst(int idx, int val){
		Node* x = new Node(idx, val);
		x->next = head;
		head = x;
	}
};

/************* root *************/
int rootCombo[MAX_MAKELIST + MAX_COPY];
int setRootCombo(int idx_struct_combo){
	if (rootCombo[idx_struct_combo] != idx_struct_combo)
		rootCombo[idx_struct_combo] = setRootCombo(rootCombo[idx_struct_combo]);
	return rootCombo[idx_struct_combo];
} 

/************* combo *************/
int value_combo[MAX_MAKELIST + MAX_COPY][MAX_LENGTH];
int idx_value_combo = 0; // tang khi luu them 1 combo co Name moi

struct Combo {
	int idx_value_combo;
	List* change;
};
Combo struct_combo[MAX_MAKELIST + MAX_COPY];
int idx_struct_combo = 0;

unordered_map<string, int> map_NameCombo; // name -> idx in value_combo


/************* API *************/

void init() {
	map_NameCombo.clear();
	idx_struct_combo = 0;
	idx_value_combo = 0;
}

// create new base combo
void makeList(char mName[], int mLength, int mListValue[]) {
	/* reset */
	struct_combo[idx_struct_combo].change = new List();
	struct_combo[idx_struct_combo].idx_value_combo = -1;

	/*  */
	rootCombo[idx_struct_combo] = idx_struct_combo; // set rootCombo
	for (int i = 0; i < mLength; i++)
		value_combo[idx_value_combo][i] = mListValue[i];
	struct_combo[idx_struct_combo].idx_value_combo = idx_value_combo;
	map_NameCombo[mName] = idx_struct_combo;
		
	idx_struct_combo++;
	idx_value_combo++;
}

// create new clone
void copyList(char mDest[], char mSrc[], bool mCopy) {
	// new -> old
	if (!mCopy)
		map_NameCombo[mDest] = map_NameCombo[mSrc];
	// new clone old
	else { 
		int srckey_hash = map_NameCombo[mSrc];
		/* reset */
		struct_combo[idx_struct_combo].change = new List();
		struct_combo[idx_struct_combo].idx_value_combo = -1;
		/*  */
		rootCombo[idx_struct_combo] = setRootCombo(srckey_hash); // set rootCombo
		struct_combo[idx_struct_combo].idx_value_combo = rootCombo[idx_struct_combo];
		struct_combo[idx_struct_combo].change = struct_combo[srckey_hash].change;
		map_NameCombo[mDest] = idx_struct_combo;

		idx_struct_combo++;
	}
}

void updateElement(char mName[], int mIndex, int mValue) {
	int key_hash = map_NameCombo[mName];
	if (struct_combo[key_hash].isCopy){
		if (struct_combo[key_hash].change->head == NULL){
			Node* x = new Node(mIndex, mValue, NULL);
			struct_combo[key_hash].change->head = x;
		}
		else
			struct_combo[key_hash].change->addFirst(mIndex, mValue);
	}
	else 
		value_combo[struct_combo[key_hash].idx_value_combo][mIndex] = mValue;
}

int element(char mName[], int mIndex) {
	int key_hash = map_NameCombo[mName];
	Node* run = struct_combo[key_hash].change->head;
	while (run != NULL){
		if (run->index_change == mIndex) return run->new_value;
		run=run->next;
	}
	return value_combo[struct_combo[key_hash].idx_value_combo][mIndex];
}
Editor is loading...
Leave a Comment