#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 100;
const int MAXK = 30;
int nex[MAXN][MAXK], f[MAXN];
int que[MAXN];
vector<int> ver[MAXN];
int st[MAXN], fn[MAXN];
int fen[MAXN], now[MAXN];
bool On[MAXN];
int sz = 0;
string s[MAXN];
void aho() {
  int ptr1 = 0, ptr2 = 0;
  for (int i = 0; i < MAXK; i++)
    if (nex[0][i] != -1)
      que[ptr2++] = nex[0][i];
    else
      nex[0][i] = 0;
  while (ptr1 != ptr2) {
    int v = que[ptr1++];
    for (int i = 0; i < MAXK; i++)
      if (nex[v][i] != -1) {
        que[ptr2++] = nex[v][i];
        f[nex[v][i]] = nex[f[v]][i];
      } else
        nex[v][i] = nex[f[v]][i];
    ver[f[v]].push_back(v);
  }
}
int T = 0;
void dfs(int v = 0) {
  st[v] = T++;
  for (auto u : ver[v]) dfs(u);
  fn[v] = T;
}
void upd(int a, int b) {
  for (a++; a < MAXN; a += a & -a) fen[a] += b;
}
int get(int a) {
  int res = 0;
  for (a++; a > 0; a -= a & -a) res += fen[a];
  return res;
}
int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int q;
  cin >> q;
  int n;
  cin >> n;
  for (int i = 0; i < n; i++) cin >> s[i];
  memset(nex, -1, sizeof nex);
  sz++;
  for (int i = 0; i < n; i++) {
    for (auto c : s[i]) {
      if (nex[now[i]][c - 'a'] == -1) nex[now[i]][c - 'a'] = sz++;
      now[i] = nex[now[i]][c - 'a'];
    }
  }
  aho();
  dfs();
  for (int i = 0; i < n; i++)
    upd(st[now[i]], +1), upd(fn[now[i]], -1), On[i] = true;
  while (q--) {
    char ch;
    cin >> ch;
    if (ch == '-') {
      int x;
      cin >> x;
      x--;
      if (On[x] == false) continue;
      On[x] = false;
      upd(st[now[x]], -1), upd(fn[now[x]], +1);
    }
    if (ch == '+') {
      int x;
      cin >> x;
      x--;
      if (On[x] == true) continue;
      On[x] = true;
      upd(st[now[x]], +1), upd(fn[now[x]], -1);
    }
    if (ch == '?') {
      string s;
      cin >> s;
      long long ans = 0;
      int temp = 0;
      for (auto c : s) {
        temp = nex[temp][c - 'a'];
        ans += get(st[temp]);
      }
      cout << ans << '\n';
    }
  }
}
