#include <bits/stdc++.h>
using namespace std;
vector<vector<int> > to, adj;
vector<int> link, term, term_node;
void init() {
  to.push_back(vector<int>(26, -1));
  term.push_back(-1);
  link.push_back(-1);
}
void add_str(string p) {
  int u = 0;
  for (int i = 0; i < int(p.size()); i++) {
    if (to[u][p[i] - 'a'] == -1) {
      to[u][p[i] - 'a'] = link.size();
      to.push_back(vector<int>(26, -1));
      term.push_back(-1);
      link.push_back(-1);
    }
    u = to[u][p[i] - 'a'];
  }
  term[u] = int((term_node).size());
  term_node.push_back(u);
}
void push_link() {
  vector<int> Q(link.size());
  int fr = 0, bk = 0;
  Q[bk++] = 0;
  while (fr < bk) {
    int u = Q[fr++];
    int j = link[u];
    for (int c = 0; c < int(int((to[u]).size())); c++) {
      int v = to[u][c];
      if (v == -1) {
        to[u][c] = j == -1 ? 0 : to[j][c];
        continue;
      }
      link[v] = j == -1 ? 0 : to[j][c];
      Q[bk++] = v;
    }
  }
}
int z;
vector<int> pre, post, tree;
void dfs(int u) {
  pre[u] = ++z;
  for (auto v : (adj[u])) {
    dfs(v);
  }
  post[u] = z;
}
void update(int id, int v) {
  while (id < int((tree).size())) {
    tree[id] += v;
    id += id & -id;
  }
}
int read(int id) {
  int ret = 0;
  while (id > 0) {
    ret += tree[id];
    id -= id & -id;
  }
  return ret;
}
void init_bit() {
  adj.resize(int((link).size()));
  for (int i = (1); i < int(int((link).size())); i++) {
    adj[link[i]].push_back(i);
  }
  pre.resize(int((link).size()));
  post.resize(int((link).size()));
  dfs(0);
  tree.resize(int((link).size()) + 1);
  for (int i = 0; i < int(int((term_node).size())); i++) {
    update(pre[term_node[i]], 1);
    update(post[term_node[i]] + 1, -1);
  }
}
int count_words(string p) {
  int ret = 0, u = 0;
  for (auto c : (p)) {
    u = to[u][c - 'a'];
    ret += read(pre[u]);
  }
  return ret;
}
int main() {
  std::ios_base::sync_with_stdio(false);
  int n, k;
  cin >> n >> k;
  init();
  for (int i = 0; i < int(k); i++) {
    string p;
    cin >> p;
    add_str(p);
  }
  push_link();
  init_bit();
  vector<int> cnt(k, 1);
  for (int i = 0; i < int(n); i++) {
    string buf;
    cin >> buf;
    if (buf[0] == '?') {
      cout << count_words(buf.substr(1)) << "\n";
    } else {
      int id = stoi(buf.substr(1)) - 1;
      if (cnt[id] == 0 && buf[0] == '+') {
        update(pre[term_node[id]], +1);
        update(post[term_node[id]] + 1, -1);
        cnt[id]++;
      } else if (cnt[id] == 1 && buf[0] == '-') {
        update(pre[term_node[id]], -1);
        update(post[term_node[id]] + 1, +1);
        cnt[id]--;
      }
    }
  }
  return 0;
}
