#include <bits/stdc++.h>
using namespace std;
const int Max = 1e6 + 1000;
int C[Max][26], F[Max], sz = 1, Q[Max], L, R, pos[Max], cnt[Max];
vector<int> N[Max];
int DEG[Max];
int sttime[Max], edtime[Max], ttime;
int seg[Max * 4], A[Max];
string s;
void Add(int i) {
  int p = 1;
  for (int i = 1; i < s.size(); i++) {
    if (C[p][s[i] - 'a'])
      p = C[p][s[i] - 'a'];
    else
      p = C[p][s[i] - 'a'] = ++sz;
  }
  cnt[p]++;
  pos[i] = p;
}
void Aho() {
  L = 1;
  F[1] = 1;
  for (int ch = 0; ch < 26; ch++)
    if (C[1][ch] != 0)
      Q[++R] = C[1][ch], F[C[1][ch]] = 1;
    else
      C[1][ch] = 1;
  while (R - L >= 0) {
    int v = Q[L++];
    for (int ch = 0; ch < 26; ch++) {
      if (C[v][ch] == 0)
        C[v][ch] = C[F[v]][ch];
      else
        F[C[v][ch]] = C[F[v]][ch], Q[++R] = C[v][ch];
    }
  }
}
void DFS(int v) {
  sttime[v] = ++ttime;
  A[sttime[v]] = cnt[v];
  for (int i = 0, u; i < DEG[v]; i++) u = N[v][i], cnt[u] += cnt[v], DFS(u);
  edtime[v] = ttime + 1;
}
void build(int tl = 1, int tr = sz + 1, int idx = 1) {
  if (tr - tl == 1) {
    seg[idx] = A[tl];
    return;
  }
  int mid = (tl + tr) >> 1;
  build(tl, mid, idx << 1);
  build(mid, tr, idx << 1 | 1);
}
void upd(int l, int r, int x, int tl = 1, int tr = sz + 1, int idx = 1) {
  if (l <= tl && tr <= r) {
    seg[idx] += x;
    return;
  }
  if (r <= tl || tr <= l) return;
  int mid = (tl + tr) >> 1;
  upd(l, r, x, tl, mid, idx << 1);
  upd(l, r, x, mid, tr, idx << 1 | 1);
}
int get(int i, int tl = 1, int tr = sz + 1, int idx = 1) {
  if (tr - tl == 1) return seg[idx];
  int mid = (tl + tr) >> 1;
  if (i < mid) return get(i, tl, mid, idx << 1) + seg[idx];
  return get(i, mid, tr, idx << 1 | 1) + seg[idx];
}
bool exist[Max];
int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  int q, n;
  cin >> q >> n;
  for (int i = 1; i <= n; i++) {
    exist[i] = 1;
    cin >> s;
    s = '.' + s;
    Add(i);
  }
  Aho();
  for (int i = 2; i <= sz; i++) DEG[F[i]]++;
  for (int i = 2; i <= sz; i++) N[F[i]].push_back(i);
  DFS(1);
  build();
  for (int i = 1; i <= q; i++) {
    char ty;
    cin >> ty;
    if (ty == '?') {
      cin >> s;
      s = '.' + s;
      int p = 1;
      long long ans = 0;
      for (int i = 1; i < s.size(); i++)
        p = C[p][s[i] - 'a'], ans += get(sttime[p]);
      cout << ans << '\n';
    } else if (ty == '-') {
      int i;
      cin >> i;
      if (exist[i]) upd(sttime[pos[i]], edtime[pos[i]], -1);
      exist[i] = 0;
    } else {
      int i;
      cin >> i;
      if (!exist[i]) upd(sttime[pos[i]], edtime[pos[i]], 1);
      exist[i] = 1;
    }
  }
}
