#include <bits/stdc++.h>
using namespace std;
const int MAXN = 3e5 + 10, B = 29, MOD = 1e9 + 7;
unordered_map<int, int> cnt[MAXN];
unordered_set<int> se;
long long pw[MAXN];
int m, ans;
string s;
void add(int len) {
  if (s.size() < len) return;
  long long H = 0;
  for (int i = 0; i < len; i++) {
    H *= B;
    H += (s[i] - 'a' + 1);
    H %= MOD;
  }
  ans += cnt[len][H];
  for (int i = len; i < s.size(); i++) {
    H -= (s[i - len] - 'a' + 1) * pw[len - 1];
    H *= B;
    H += s[i] - 'a' + 1;
    H %= MOD;
    if (H < 0) H += MOD;
    ans += cnt[len][H];
  }
}
long long tohash(string &a) {
  long long H = 0;
  for (int i = 0; i < a.size(); i++) {
    H *= B;
    H += (a[i] - 'a' + 1);
    H %= MOD;
  }
  return H;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  pw[0] = 1;
  for (int i = 1; i < MAXN; i++) pw[i] = pw[i - 1] * B, pw[i] %= MOD;
  cin >> m;
  while (m--) {
    int t;
    cin >> t >> s;
    if (t == 1)
      cnt[s.size()][tohash(s)]++, se.insert(s.size());
    else if (t == 2)
      cnt[s.size()][tohash(s)]--;
    else {
      ans = 0;
      for (unordered_set<int>::iterator it = se.begin(); it != se.end(); it++)
        add(*it);
      cout << ans << '\n';
      cout.flush();
    }
  }
}
