#include <bits/stdc++.h>
using namespace std;
const double pi = acos(-1.0);
template <typename T, typename U>
inline void amin(T& x, U y) {
  if (y < x) x = y;
}
template <typename T, typename U>
inline void amax(T& x, U y) {
  if (x < y) x = y;
}
template <typename T>
inline void write(T x) {
  int i = 20;
  char buf[21];
  buf[20] = 12;
  do {
    buf[--i] = x % 10 + '0';
    x /= 10;
  } while (x);
  do {
    putchar(buf[i]);
  } while (buf[i++] != 12);
}
template <typename T>
inline T readInt() {
  T n = 0, s = 1;
  char p = getchar();
  if (p == '-') s = -1;
  while ((p < '0' || p > '9') && p != EOF && p != '-') p = getchar();
  if (p == '-') s = -1, p = getchar();
  while (p >= '0' && p <= '9') {
    n = (n << 3) + (n << 1) + (p - '0');
    p = getchar();
  }
  return n * s;
}
class Debugger {
 public:
  Debugger(const std::string& _separator = " - ")
      : first(true), separator(_separator) {}
  template <typename ObjectType>
  Debugger& operator,(const ObjectType& v) {
    if (!first)
    std:
      cerr << separator;
    std::cerr << v;
    first = false;
    return *this;
  }
  ~Debugger() {
  std:
    cerr << endl;
  }

 private:
  bool first;
  std::string separator;
};
int main() {
  ios_base::sync_with_stdio(false);
  long int tree[600000] = {0};
  long int root = 1;
  long int t;
  cin >> t;
  for (int i = 0; i < t; i += 1) {
    char cmd;
    string input;
    cin >> cmd >> input;
    if (cmd == '+') {
      long int traverse = root;
      for (int j = (long int)input.size() - 1; j >= 0; j -= 1) {
        long int digit = input[j] - '0';
        if (digit % 2) {
          traverse = traverse * 2 + 1;
        } else {
          traverse = traverse * 2;
        }
      }
      tree[traverse]++;
    } else if (cmd == '-') {
      long int traverse = root;
      for (int j = (long int)input.size() - 1; j >= 0; j -= 1) {
        long int digit = input[j] - '0';
        if (digit % 2) {
          traverse = traverse * 2 + 1;
        } else {
          traverse = traverse * 2;
        }
      }
      tree[traverse]--;
    } else if (cmd == '?') {
      long int ans = 0;
      long int possible_candidate = 0;
      long int traverse = root;
      for (int j = (long int)input.size() - 1; j >= 0; j -= 1) {
        long int digit = input[j] - '0';
        if (digit % 2) {
          traverse = traverse * 2 + 1;
        } else {
          traverse = traverse * 2;
        }
        if (digit) {
          possible_candidate = 0;
        }
        if (j > 0) {
          possible_candidate += tree[traverse];
        }
      }
      ans = tree[traverse] + possible_candidate;
      while (traverse * 2 < 600000) {
        traverse = traverse * 2;
        ans += tree[traverse];
      }
      cout << ans << '\n';
    }
  }
  return 0;
}
