Hi all, can anyone tell what is wrong with my code for HASHIT problem?
or maybe some corner testcase that fail my code?
Thank advance
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
using namespace std;
struct node {
bool hidden;
char *keys;
};
struct node *table[101];
int data;
void insert (char*);
void remove (char*);
void display();
int main () {
int tc;
cin >> tc;
while (tc--) {
int n;
cin >> n; getchar();
memset(table, 0, 101*sizeof(struct node**));
data=0;
while (n--) {
char *input = new char[50];
scanf("%s", input);
if (strlen(input) < 5) continue;
if (!strncmp(input, "ADD:", 4)) insert(&input[4]);
else if (!strncmp(input, "DEL:", 4)) remove(&input[4]);
}
cout << data << endl;
display();
}
}
int hashit (char *input, int ln) {
int index=0;
for (int x=0; x<ln; x++) {
index += ((int)input[x] * (x+1));
}
return index * 19;
}
void insert (char *input) {
int i = hashit(input, strlen(input)) % 101;
for (int j=0; j<20; j++) {
i = (i + (j * j) + (23 * j)) % 101;
if (!table[i]) {
table[i] = new struct node;
table[i]->keys = new char[20];
strcpy(table[i]->keys, input);
table[i]->hidden = false;
data++; break;
}
else {
if (table[i]->hidden) {
strcpy(table[i]->keys, input);
table[i]->hidden = false;
data++; break;
}
else if (!strcmp(table[i]->keys, input)) {
if (table[i]->hidden) data++;
table[i]->hidden = false;
break;
}
}
}
}
void remove (char *input) {
int i = hashit(input, strlen(input)) % 101;
for (int j=0; j<20; j++) {
i = (i + (j * j) + (23 * j)) % 101;
if (table[i]) {
if (!strcmp(table[i]->keys, input)) {
if (!table[i]->hidden) data--;
table[i]->hidden = true;
break;
}
}
}
}
void display() {
for (int x=0; x<101; x++) {
if (table[x]) {
if (!table[x]->hidden) {
cout << x << ':' << table[x]->keys << endl;
}
}
}
}