Untitled
unknown
plain_text
2 years ago
2.5 kB
16
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;
struct Node{
int index_change;
int new_value;
Node* next;
Node(int idx, int val, Node* x): index_change(idx), new_value(new_value), next(x){};
};
struct List{
Node* head;
List():head(NULL){};
void addFirst(int idx, int val){
Node* x = new Node(idx, val, head);
head = x;
}
};
int idx_pool_origin;
int pool_origin[MAX_MAKELIST][MAX_LENGTH];
struct ARR {
int originIndex; // origin data of this list
List* change;
bool isCopy;
};
int idx_pool_arr;
ARR pool_arr[MAX_MAKELIST + MAX_COPY];
unordered_map<string, int> hm; // name - idx List
void init() {
hm.clear();
idx_pool_arr = 0;
idx_pool_origin = 0;
}
void makeList(char mName[], int mLength, int mListValue[]) {
/* reset */
pool_arr[idx_pool_arr].isCopy = false;
pool_arr[idx_pool_arr].change = new List();
for (int i = 0; i < mLength; i++)
pool_origin[idx_pool_origin][i] = mListValue[i];
pool_arr[idx_pool_arr].originIndex = idx_pool_origin;
hm[mName] = idx_pool_arr;
idx_pool_arr++;
idx_pool_origin++;
}
void copyList(char mDest[], char mSrc[], bool mCopy) {
int srckey_hash = hm[mSrc];
// assign
if (!mCopy)
hm[mDest] = srckey_hash;
else { // clone
/* reset */
pool_arr[idx_pool_arr].isCopy = false;
pool_arr[idx_pool_arr].change = new List();
pool_arr[idx_pool_arr].isCopy = true;
pool_arr[srckey_hash].isCopy = true;
pool_arr[idx_pool_arr].originIndex = pool_arr[srckey_hash].originIndex;
pool_arr[idx_pool_arr].change = pool_arr[srckey_hash].change;
hm[mDest] = idx_pool_arr;
idx_pool_arr++;
}
}
void updateElement(char mName[], int mIndex, int mValue) {
int key_hash = hm[mName];
if (pool_arr[key_hash].isCopy){
if (pool_arr[key_hash].change->head == NULL){
Node* x = new Node(mIndex, mValue, NULL);
pool_arr[key_hash].change->head = x;
}
else
pool_arr[key_hash].change->addFirst(mIndex, mValue);
}
else
pool_origin[pool_arr[key_hash].originIndex][mIndex] = mValue;
}
int element(char mName[], int mIndex) {
int key_hash = hm[mName];
Node* run = pool_arr[key_hash].change->head;
while (run != NULL){
if (run->index_change == mIndex) return run->new_value;
run=run->next;
}
return pool_origin[pool_arr[key_hash].originIndex][mIndex];
}Editor is loading...
Leave a Comment