#include <bits/stdc++.h>
using namespace std;
struct node {
  int id;
  node *next[26], *fail;
} * root, data[1000005];
int cnt;
int state[100005];
int pos[100005];
node *newnode() {
  for (int i = 0; i < 26; i++) data[cnt].next[i] = NULL;
  data[cnt].id = cnt;
  data[cnt].fail = NULL;
  return &data[cnt++];
}
void insert(char *str, int nn) {
  int i = 0, x;
  node *p = root;
  while (str[i]) {
    x = str[i] - 'a';
    if (p->next[x] == NULL) p->next[x] = newnode();
    p = p->next[x];
    i++;
  }
  pos[nn] = p->id;
}
void build_ac_automation() {
  queue<node *> q;
  node *tmp = root;
  q.push(tmp);
  while (!q.empty()) {
    tmp = q.front();
    q.pop();
    for (int i = 0; i < 26; i++)
      if (tmp->next[i] == NULL) {
        if (tmp == root)
          tmp->next[i] = root;
        else
          tmp->next[i] = tmp->fail->next[i];
      } else {
        if (tmp == root)
          tmp->next[i]->fail = root;
        else {
          tmp->next[i]->fail = tmp->fail->next[i];
        }
        q.push(tmp->next[i]);
      }
  }
}
int d[1000005 * 2];
int bg[1000005], ed[1000005], idx;
int lowbit(int x) { return x & (-x); }
void update(int x, int data) {
  for (int i = x; i < idx; i += lowbit(i)) d[i] += data;
}
int query(int x) {
  int ret = 0;
  for (int i = x; i > 0; i -= lowbit(i)) ret += d[i];
  return ret;
}
vector<int> g[1000005];
void dfs(int x) {
  bg[x] = idx++;
  int l = g[x].size();
  for (int i = 0; i < l; i++) dfs(g[x][i]);
  ed[x] = idx++;
}
char str[1000005];
long long solve() {
  long long ans = 0;
  int i = 1, x;
  node *p = root;
  while (str[i]) {
    x = str[i] - 'a';
    p = p->next[x];
    ans += query(bg[p->id]);
    i++;
  }
  return ans;
}
int n, K;
int main() {
  while (scanf("%d %d", &n, &K) != EOF) {
    cnt = 0;
    root = newnode();
    for (int i = 1; i <= K; i++) {
      scanf("%s", str);
      insert(str, i);
    }
    build_ac_automation();
    for (int i = 0; i < cnt; i++) g[i].clear();
    for (int i = 1; i < cnt; i++) g[data[i].fail->id].push_back(i);
    idx = 1;
    dfs(0);
    for (int i = 0; i <= idx; i++) d[i] = 0;
    for (int i = 1; i <= K; i++) {
      update(bg[pos[i]], 1);
      update(ed[pos[i]], -1);
    }
    for (int i = 1; i <= K; i++) state[i] = 1;
    for (int i = 1; i <= n; i++) {
      scanf("%s", str);
      if (str[0] == '?') {
        cout << solve() << endl;
      } else if (str[0] == '+') {
        int x = atoi(str + 1);
        if (state[x] == 0) {
          state[x] = 1;
          update(bg[pos[x]], 1);
          update(ed[pos[x]], -1);
        }
      } else if (str[0] == '-') {
        int x = atoi(str + 1);
        if (state[x] == 1) {
          state[x] = 0;
          update(bg[pos[x]], -1);
          update(ed[pos[x]], 1);
        }
      }
    }
  }
  return 0;
}
