#include <bits/stdc++.h>
using namespace std;
set<int> s[300000];
char str[310000];
int cnt[310000];
long long powc[310000];
multiset<int> check;
int main() {
  int m;
  scanf("%d", &m);
  powc[0] = 1;
  for (int i = 1; i < 310000; i++) {
    powc[i] = (3533 * powc[i - 1]) % 1000000009;
  }
  for (int i = 0; i < 310000; i++) cnt[i] = 0;
  for (int i = 0; i < m; i++) {
    int t;
    scanf("%d%s", &t, str);
    int d = strlen(str);
    if (t != 3) {
      long long r = 0;
      for (int i = 0; i < d; i++) {
        r *= 3533;
        r += (str[i] - 'a' + 1);
        r %= 1000000009;
      }
      if (t == 1) {
        s[d].insert(r);
        if (cnt[d] == 0) check.insert(d);
        cnt[d]++;
      }
      if (t == 2) {
        s[d].erase(r);
        cnt[d]--;
        if (cnt[d] == 0) check.erase(d);
      }
    } else if (t == 3) {
      long long ans = 0;
      for (multiset<int>::iterator a = check.begin(); a != check.end(); a++) {
        int l = *a;
        if (l > d) {
          break;
        }
        long long r = 0;
        for (int i = 0; i < l; i++) {
          r *= 3533;
          r += (str[i] - 'a' + 1);
          r %= 1000000009;
        }
        ans += s[l].count(r);
        for (int i = l; i < d; i++) {
          r *= 3533;
          r -= powc[l] * (str[i - l] - 'a' + 1);
          r += (str[i] - 'a' + 1);
          r %= 1000000009;
          while (r < 0) r += 1000000009;
          ans += s[l].count(r);
        }
      }
      printf("%I64d\n", ans);
      fflush(stdout);
    }
  }
}
