#include <iostream>
#include <string>

struct Node {
  std::string name;
  Node* left = nullptr;
  Node* right = nullptr;
  int height = 1;
  
  Node(const std::string& name) : name(name) {}
};

int height(Node* root) {
  if (root == nullptr) return 0;
  return root->height;
}

int Balance(Node* root) {
  if (root == nullptr) return 0;
  return height(root->left) - height(root->right);
}

Node* RightRotation(Node* y) {
  Node* x = y->left;
  Node* T2 = x->right;
  
  x->right = y;
  y->left = T2;
  
  y->height = std::max(height(y->left), height(y->right)) + 1;
  x->height = std::max(height(x->left), height(x->right)) + 1;
  
  return x;
}

Node* LeftRotation(Node* x) {
  Node* y = x->right;
  Node* T2 = y->left;
  
  y->left = x;
  x->right = T2;
  
  x->height = std::max(height(x->left), height(x->right)) + 1;
  y->height = std::max(height(y->left), height(y->right)) + 1;
  
  return y;
}

bool find(std::vector<char>& arr, char eq_ch) {
  for (auto ch : arr) {
    if (ch == eq_ch) return true;
  }
  return false;
}

void Insert(Node*& root, const std::string& name, std::vector<char>& unique_simbols) {
  if (!root) {
    root = new Node(name);
    return;
  }
  
  if (name < root->name) {
    Insert(root->left, name, unique_simbols);
  } else if (name > root->name) {
    Insert(root->right, name, unique_simbols);
  } else {
    for (auto ch : name) {
      if (!find(unique_simbols, ch)) {
        unique_simbols.push_back(ch);
      }
    }
  }
  
  root->height = 1 + std::max(height(root->left), height(root->right));
  
  int balance = Balance(root);
  
  if (balance > 1 && name < root->left->name) {
    root = RightRotation(root);
  } else if (balance < -1 && name > root->right->name) {
    root = LeftRotation(root);
  } else if (balance > 1 && name > root->left->name) {
    root->left = LeftRotation(root->left);
    root = RightRotation(root);
  } else if (balance < -1 && name < root->right->name) {
    root->right = RightRotation(root->right);
    root = LeftRotation(root);
  }
}

int main() {
  int n;
  std::cin >> n;
  std::vector<char> unique_simbols;
  Node* root = nullptr;
  for (int i = 0; i < n; ++i) {
    std::string name;
    std::cin >> name;
    Insert(root, name, unique_simbols);
  }
  std::cout << unique_simbols.size();
}


мой код почему то не проходит 3-й тест в задаче ниже(я не знаю что за тест) исправь пж пж
У Пети в телефоне записаны номера друзей. Однажды Петя заметил, что у него кончается свободная память на устройстве. Петя знал, что среди его контактов есть множество дубликатов. Он решил удалить повторяющиеся записи.

Каждый контакт - это строка, состоящая исключительно из строчных или заглавных букв латинского алфавита и цифр. При удалении строки освобождается 
�
M байт памяти, где 
�
M - количество различных символов в данной строке. Помогите Пете узнать, сколько памяти в байтах он сможет освободить.

Входные данные

В первой строке входных данных дается число 
�
n (
1
≤
�
≤
1
0
5
1≤n≤10 
5
 ) - количество контактов в телефоне.

В следующей строке записаны через пробел 
�
n строк - контакты Пети.

Выходные данные

Выведите одно число - ответ на задачу.

STDIN	STDOUT
5
qqwe qqwe abc s s

4

Примечание

Решения, написанные при помощи сортировок, бинпоиска или встроенных деревьев, структур данных set, map и прочих - не засчитываются.