#include #include int hash(char *key); int dodaj(char *key); int usun(char *key); void wyswietl(void); char tablica[101][16]; int licznik; int main() { char polecenie[4], key[16]; int t, n; scanf("%d", &t); /*ilosc testow*/ while(t--) { memset(tablica, 0, 16*101*sizeof(char)); scanf("%d", &n); /*ilosc operacji*/ while(n--) { scanf("%3s:%15s", &polecenie, &key); if(strcmp(polecenie, "ADD")==0) dodaj(key); else usun(key); } wyswietl(); licznik=0; } return 0; } int hash(char *key) { int i, h=0; for(i=1; *key!='\0'; key++, i++) { h+= (*key)*i; } h*=19; h%=101; return h; } int dodaj(char *key) { int h, poz, i; h=hash(key); if(tablica[h][0]==0) /*puste miejsce*/ { strcpy(tablica[h], key); licznik++; } else { for(i=0; i<20; i++) { poz=(h + i*i + 23*i)%101; if(strcmp(tablica[poz], key)==0) return 0; /*istnieje taki sam string*/ else if(tablica[poz][0]==0) /*puste miejce*/ { strcpy(tablica[poz], key); licznik++; return 0; } } } /*printf("%d %s\n", h, tablica[h]);*/ return 0; } int usun(char *key) { int h, i, poz; h=hash(key); /*if(tablica[h][0]!=0)*/ for(i=0; i<20; i++) { poz=(h + i*i + 23*i)%101; /*if(tablica[poz][0]==0) /*nic nie ma*/ /*{ break; }*/ if(strcmp(tablica[poz], key)==0) /*kasowanie*/ { tablica[h][0]=0; licznik--; break; } } return 0; } void wyswietl(void) { int i; printf("%d\n", licznik); for(i=0; licznik>0 && i<101; i++) { if(tablica[i][0]!=0) { printf("%d:%s\n", i, tablica[i]); } } }