#include <bits/stdc++.h>
using namespace std;
int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9')
    x = (x << 1) + (x << 3) + ch - '0', ch = getchar();
  return x * f;
}
int read_c() {
  char ch = getchar();
  while (ch != '+' && ch != '-' && ch != '?') ch = getchar();
  if (ch == '-') return 1;
  if (ch == '+') return 2;
  if (ch == '?') return 3;
}
const int N = 1000005;
int cnt, head[N], son[N][26], sc, mp[N], fail[N], in[N], out[N], bit[N], n, k,
    x, col[N];
char c, s[N];
struct node {
  int to, next;
} num[N];
void Add(int x, int y) {
  num[++cnt].to = y;
  num[cnt].next = head[x];
  head[x] = cnt;
}
void ins(char *s, int i) {
  int now = 0, sl = strlen(s);
  for (int i = 0; i < sl; i++) {
    int c = s[i] - 'a';
    if (!son[now][c]) son[now][c] = ++sc;
    now = son[now][c];
  }
  mp[i] = now;
}
void build() {
  queue<int> q;
  for (int i = 0; i < 26; i++)
    if (son[0][i]) q.push(son[0][i]);
  while (!q.empty()) {
    int now = q.front();
    q.pop();
    Add(fail[now], now);
    for (int i = 0; i < 26; i++)
      if (son[now][i])
        fail[son[now][i]] = son[fail[now]][i], q.push(son[now][i]);
      else
        son[now][i] = son[fail[now]][i];
  }
}
void dfs(int x) {
  in[x] = ++cnt;
  for (int i = head[x]; i; i = num[i].next) dfs(num[i].to);
  out[x] = cnt;
}
int lowbit(int x) { return x & (-x); }
void add(int x, int y) {
  while (x <= cnt) {
    bit[x] += y;
    x += lowbit(x);
  }
}
int sum(int x) {
  int res = 0;
  while (x) res += bit[x], x -= lowbit(x);
  return res;
}
int solve(char *s) {
  int now = 0, sl = strlen(s), ans = 0;
  for (int i = 0; i < sl; i++) {
    now = son[now][s[i] - 'a'];
    ans += sum(in[now]);
  }
  return ans;
}
int main() {
  k = read();
  n = read();
  for (int i = 1; i <= n; i++) scanf("%s", s), ins(s, i), col[i] = 1;
  build();
  cnt = 0;
  dfs(0);
  for (int i = 1; i <= n; i++) add(in[mp[i]], 1), add(out[mp[i]] + 1, -1);
  while (k--) {
    c = read_c();
    if (c == 1) {
      x = read();
      if (col[x]) add(in[mp[x]], -1), add(out[mp[x]] + 1, 1), col[x] = 0;
    } else if (c == 2) {
      x = read();
      if (!col[x]) add(in[mp[x]], 1), add(out[mp[x]] + 1, -1), col[x] = 1;
    } else {
      scanf("%s", s);
      printf("%d\n", solve(s));
    }
  }
  return 0;
}
