#include <bits/stdc++.h>
using namespace std;
int n, root, cnt = 1, Tim;
char s[1000005], ss[1000005];
bool in[1000005];
int pos[1000005], ch[1000005][26], fail[1000005], a[1000005], st[1000005],
    ed[1000005];
vector<int> v[1000005];
void insert(int id) {
  int now = root;
  int len = strlen(s + 1);
  for (int i = 1; i <= len; i++) {
    if (!ch[now][s[i] - 'a']) {
      ch[now][s[i] - 'a'] = ++cnt;
    }
    now = ch[now][s[i] - 'a'];
  }
  pos[id] = now;
}
void mengtinghui() {
  queue<int> q;
  q.push(1);
  fail[1] = 1;
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    for (int i = 0; i < 26; i++) {
      if (ch[x][i]) {
        q.push(ch[x][i]);
        if (x == 1)
          fail[ch[x][i]] = 1;
        else {
          fail[ch[x][i]] = ch[fail[x]][i];
          if (!fail[ch[x][i]]) fail[ch[x][i]] = 1;
        }
      } else {
        ch[x][i] = ch[fail[x]][i];
      }
    }
  }
  for (int i = 2; i <= cnt; i++)
    if (fail[i] == 0) fail[i] = 1;
  for (int i = 2; i <= cnt; i++) v[fail[i]].push_back(i);
}
void dfs(int x) {
  Tim++;
  st[x] = Tim;
  for (int i = 0; i < (int)v[x].size(); i++) {
    dfs(v[x][i]);
  }
  ed[x] = Tim;
}
inline int lowbit(int x) { return x & (-x); }
void add(int x, int val) {
  for (int i = x; i <= cnt; i += lowbit(i)) a[i] += val;
}
int query(int x) {
  int ret = 0;
  while (x) {
    ret += a[x];
    x -= lowbit(x);
  }
  return ret;
}
int query() {
  int len = strlen(ss);
  int now = root;
  int ret = 0;
  for (int i = 1; i < len; i++) {
    int c = ss[i] - 'a';
    while (now != 1 && !ch[now][c]) {
      now = fail[now];
    }
    now = ch[now][c];
    if (now == 0) now = 1;
    ret += query(st[now]);
  }
  return ret;
}
int main() {
  int Q;
  scanf("%d%d", &Q, &n);
  root = 1;
  for (int i = 1; i <= n; i++) {
    scanf("%s", s + 1);
    insert(i);
  }
  mengtinghui();
  dfs(1);
  for (int i = 1; i <= n; i++) {
    in[i] = 1;
    add(st[pos[i]], 1);
    add(ed[pos[i]] + 1, -1);
  }
  while (Q--) {
    scanf("%s", ss);
    if (ss[0] == '?') {
      printf("%d\n", query());
    } else if (ss[0] == '+') {
      int wh = 0;
      int len = strlen(ss);
      for (int i = 1; i < len; i++) {
        wh = wh * 10 + ss[i] - '0';
      }
      if (in[wh]) continue;
      add(st[pos[wh]], 1);
      add(ed[pos[wh]] + 1, -1);
      in[wh] = 1;
    } else {
      int wh = 0;
      int len = strlen(ss);
      for (int i = 1; i < len; i++) {
        wh = wh * 10 + ss[i] - '0';
      }
      if (!in[wh]) continue;
      add(st[pos[wh]], -1);
      add(ed[pos[wh]] + 1, 1);
      in[wh] = 0;
    }
  }
  return 0;
}
