#include<bits/stdc++.h>
#define TABLE_SIZE 101
using namespace std;
static int cnt = 0;
vector<string> HashTable(TABLE_SIZE,"");
int h (string key){
long long int sum = 0;
for(int i =0; i<key.size(); i++){
sum += key[i]*(i+1);
}
return 19*sum;
}
int Hash(string key){
long long int sum = h(key);
return sum%101;
}
void hash_insert(string key){
int hash_slot = Hash(key);
int j=1;
if(find(HashTable.begin(), HashTable.end(), key)!=HashTable.end()){
return;
}
while ( HashTable[hash_slot] != "" && j < 20){
hash_slot = int((Hash(key) + pow(j,2) + 23*j))%101;
//cout<<hash_slot<<"\n";
j++;
}
HashTable[hash_slot] = key;
cnt += 1;
}
void hash_delete(string key){
if(find(HashTable.begin(), HashTable.end(), key)== HashTable.end()){
return;
}
int hash_slot = Hash(key);
while ( HashTable[hash_slot] != key){
hash_slot = (hash_slot+1)%101;
}
HashTable[hash_slot] = "";
cnt -= 1;
}
int main(){
int i;
cin>>i;
while(i--){
int j;
cin>>j;
while(j--){
string key, initial="";
int ind=0;
cin>>key;
while(ind!=3){
initial += key[ind++];
}
key.erase(0,4);
if(initial == "ADD"){
hash_insert(key);
}
else{
hash_delete(key);
}
}
cout<<cnt<<"\n";
for(int i=0; i<TABLE_SIZE;i++){
if(HashTable[i]!=""){
cout<<i<<":"<<HashTable[i]<<"\n";
}
}
fill(HashTable.begin(), HashTable.end(), "");
cnt = 0;
}
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KI2RlZmluZSBUQUJMRV9TSVpFIDEwMQoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0YXRpYyBpbnQgY250ID0gMDsKdmVjdG9yPHN0cmluZz4gSGFzaFRhYmxlKFRBQkxFX1NJWkUsIiIpOwoKaW50IGggKHN0cmluZyBrZXkpewogICAgbG9uZyBsb25nIGludCBzdW0gPSAwOwogICAgZm9yKGludCBpID0wOyBpPGtleS5zaXplKCk7IGkrKyl7CiAgICAgICAgc3VtICs9IGtleVtpXSooaSsxKTsKICAgIH0KICAgIHJldHVybiAxOSpzdW07Cn0KCmludCBIYXNoKHN0cmluZyBrZXkpewogICAgbG9uZyBsb25nIGludCBzdW0gPSBoKGtleSk7CiAgICByZXR1cm4gc3VtJTEwMTsKfQoKdm9pZCBoYXNoX2luc2VydChzdHJpbmcga2V5KXsKICAgIGludCBoYXNoX3Nsb3QgPSBIYXNoKGtleSk7CiAgICBpbnQgaj0xOwoKICAgIGlmKGZpbmQoSGFzaFRhYmxlLmJlZ2luKCksIEhhc2hUYWJsZS5lbmQoKSwga2V5KSE9SGFzaFRhYmxlLmVuZCgpKXsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgd2hpbGUgKCBIYXNoVGFibGVbaGFzaF9zbG90XSAhPSAiIiAmJiBqIDwgMjApewogICAgICAgIGhhc2hfc2xvdCA9IGludCgoSGFzaChrZXkpICsgcG93KGosMikgKyAyMypqKSklMTAxOwogICAgICAgIC8vY291dDw8aGFzaF9zbG90PDwiXG4iOwogICAgICAgIGorKzsKICAgIH0KICAgIEhhc2hUYWJsZVtoYXNoX3Nsb3RdID0ga2V5OwogICAgY250ICs9IDE7Cn0KCnZvaWQgaGFzaF9kZWxldGUoc3RyaW5nIGtleSl7CiAgICBpZihmaW5kKEhhc2hUYWJsZS5iZWdpbigpLCBIYXNoVGFibGUuZW5kKCksIGtleSk9PSBIYXNoVGFibGUuZW5kKCkpewogICAgICAgIHJldHVybjsKICAgIH0KICAgIGludCBoYXNoX3Nsb3QgPSBIYXNoKGtleSk7CiAgICB3aGlsZSAoIEhhc2hUYWJsZVtoYXNoX3Nsb3RdICE9IGtleSl7CiAgICAgICAgaGFzaF9zbG90ID0gKGhhc2hfc2xvdCsxKSUxMDE7CiAgICB9CiAgICBIYXNoVGFibGVbaGFzaF9zbG90XSA9ICIiOwogICAgY250IC09IDE7Cn0KCmludCBtYWluKCl7CiAgICBpbnQgaTsKCiAgICBjaW4+Pmk7CiAgICB3aGlsZShpLS0pewogICAgICAgIGludCBqOwogICAgICAgIGNpbj4+ajsKICAgICAgICB3aGlsZShqLS0pewogICAgICAgICAgICBzdHJpbmcga2V5LCBpbml0aWFsPSIiOwogICAgICAgICAgICBpbnQgaW5kPTA7CiAgICAgICAgICAgIGNpbj4+a2V5OwogICAgICAgICAgICB3aGlsZShpbmQhPTMpewogICAgICAgICAgICAgICAgaW5pdGlhbCArPSBrZXlbaW5kKytdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBrZXkuZXJhc2UoMCw0KTsKCiAgICAgICAgICAgIGlmKGluaXRpYWwgPT0gIkFERCIpewogICAgICAgICAgICAgICAgaGFzaF9pbnNlcnQoa2V5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgaGFzaF9kZWxldGUoa2V5KTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgY291dDw8Y250PDwiXG4iOwogICAgICAgIGZvcihpbnQgaT0wOyBpPFRBQkxFX1NJWkU7aSsrKXsKICAgICAgICAgICAgaWYoSGFzaFRhYmxlW2ldIT0iIil7CiAgICAgICAgICAgICAgICBjb3V0PDxpPDwiOiI8PEhhc2hUYWJsZVtpXTw8IlxuIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmaWxsKEhhc2hUYWJsZS5iZWdpbigpLCBIYXNoVGFibGUuZW5kKCksICIiKTsKICAgICAgICBjbnQgPSAwOwogICAgfQp9Cg==