#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1000005;
const int MAXC = 26;
int pos[MAXN];
char s[MAXN];
bool exist[MAXN];
struct AC {
  int tot, ch[MAXN][MAXC], fail[MAXN];
  int fir[MAXN], to[MAXN], nxt[MAXN], cnt;
  void add(int x, int y) {
    to[++cnt] = y;
    nxt[cnt] = fir[x];
    fir[x] = cnt;
  }
  int insert() {
    int r = 0;
    for (int i = 0; s[i]; i++) {
      int val = s[i] - 'a';
      if (!ch[r][val]) ch[r][val] = ++tot;
      r = ch[r][val];
    }
    return r;
  }
  int myq[MAXN], head, tail;
  void build() {
    head = tail = 0;
    myq[tail++] = 0;
    while (head < tail) {
      int r = myq[head++];
      for (int i = 0; i < MAXC; i++) {
        int &v = ch[r][i], p = fail[r];
        if (v) {
          fail[v] = r ? ch[p][i] : 0;
          myq[tail++] = v;
        } else
          v = ch[p][i];
      }
    }
    for (int i = 1; i <= tot; i++) add(fail[i], i);
  }
  int dfs_clock, in[MAXN], ou[MAXN], t[MAXN];
  void dfs(int r) {
    in[r] = ++dfs_clock;
    for (int i = fir[r]; i; i = nxt[i]) dfs(to[i]);
    ou[r] = dfs_clock;
  }
  void update(int x, int val) {
    while (x) t[x] += val, x -= (x & (-x));
  }
  int getsum(int x) {
    int ret = 0;
    while (x <= dfs_clock) ret += t[x], x += (x & (-x));
    return ret;
  }
  void modify(int i, int val) {
    if ((!exist[i] && val == -1) || (exist[i] && val == 1)) return;
    if (!exist[i]) {
      exist[i] = true;
      update(ou[pos[i]], 1);
      update(in[pos[i]] - 1, -1);
    } else {
      exist[i] = false;
      update(ou[pos[i]], -1);
      update(in[pos[i]] - 1, 1);
    }
  }
  long long query() {
    int r = 0;
    long long ret = 0;
    for (int i = 0; s[i]; i++) {
      int val = s[i] - 'a';
      r = ch[r][val];
      ret += getsum(in[r]);
    }
    return ret;
  }
} ac;
int main() {
  int Q, N, x;
  char c;
  scanf("%d%d", &Q, &N);
  for (int i = 1; i <= N; i++) scanf("%s", s), pos[i] = ac.insert();
  ac.build();
  ac.dfs(0);
  for (int i = 1; i <= N; i++) ac.modify(i, 1);
  while (Q--) {
    while ((c = getchar()) != '?' && c != '+' && c != '-')
      ;
    if (c == '?')
      scanf("%s", s), printf("%lld\n", ac.query());
    else
      scanf("%d", &x), ac.modify(x, c == '+' ? 1 : -1);
  }
}
