#include <bits/stdc++.h>
using namespace std;
const int sz = 1e6 + 527;
int n, m;
int l, sum, ans;
int T, cnt, o, rt, k, tot;
int last[sz], b[sz], f[sz];
int dfn[sz], r[sz], head[sz];
char s[sz];
struct wxp {
  int e[26], fail;
} c[sz];
struct Edge {
  int v, nxt;
} edge[sz << 1];
void add(int x, int sum) {
  while (x <= tot) {
    f[x] += sum;
    x += x & (-x);
  }
}
int query(int x) {
  int ret = 0;
  while (x) {
    ret += f[x];
    x -= x & -x;
  }
  return ret;
}
void make_edge(int u, int v) {
  edge[++cnt] = (Edge){v, head[u]};
  head[u] = cnt;
}
void insert(char s[], int num) {
  l = strlen(s);
  o = rt;
  for (int i = 0; i < l; i++) {
    k = s[i] - 'a';
    if (!c[o].e[k]) c[o].e[k] = ++tot;
    o = c[o].e[k];
  }
  last[num] = o;
}
void build() {
  int j;
  queue<int> q;
  o = rt;
  for (k = 0; k < 26; k++)
    if (c[o].e[k]) {
      make_edge(rt, c[o].e[k]);
      c[c[o].e[k]].fail = rt;
      q.push(c[o].e[k]);
    } else
      c[o].e[k] = rt;
  while (q.empty() == 0) {
    o = q.front();
    q.pop();
    for (k = 0; k < 26; k++) {
      if (c[o].e[k]) {
        c[c[o].e[k]].fail = c[c[o].fail].e[k] ? c[c[o].fail].e[k] : rt;
        make_edge(c[c[o].e[k]].fail, c[o].e[k]);
        q.push(c[o].e[k]);
      } else
        c[o].e[k] = c[c[o].fail].e[k] ? c[c[o].fail].e[k] : rt;
    }
  }
}
void dfs(int x) {
  dfn[x] = ++T;
  for (int i = head[x]; i; i = edge[i].nxt) dfs(edge[i].v);
  r[x] = T;
}
int main() {
  rt = ++tot;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; i++) {
    scanf("%s", s);
    insert(s, i);
  }
  build();
  dfs(rt);
  for (int i = 1; i <= m; i++) {
    add(dfn[last[i]], 1);
    add(r[last[i]] + 1, -1);
    b[i] = 1;
  }
  while (n--) {
    scanf("%s", s);
    l = strlen(s);
    if (s[0] == '+') {
      sum = 0;
      for (int i = 1; i < l; i++) sum = sum * 10 + s[i] - '0';
      if (b[sum]) continue;
      add(dfn[last[sum]], 1);
      add(r[last[sum]] + 1, -1);
      b[sum] = 1;
    } else if (s[0] == '-') {
      sum = 0;
      for (int i = 1; i < l; i++) sum = sum * 10 + s[i] - '0';
      if (b[sum] == 0) continue;
      add(dfn[last[sum]], -1);
      add(r[last[sum]] + 1, 1);
      b[sum] = 0;
    } else {
      ans = 0;
      o = rt;
      for (int i = 1; i < l; i++) {
        k = s[i] - 'a';
        ans += query(dfn[o = c[o].e[k]]);
      }
      printf("%d\n", ans);
    }
  }
}
