#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
const int maxn = 1e6 + 5;
int n, q, m;
const int N = 105;
const int L = 1505;
char s[maxn];
int tr[maxn][30], tot = 0;
int fail[maxn], w[maxn];
vector<int> g[maxn];
void add(char *s, int id) {
  int u = 0;
  int n = strlen(s);
  for (int i = 0; i < n; i++) {
    int c = s[i] - 'a';
    if (!tr[u][c]) tr[u][c] = ++tot;
    u = tr[u][c];
  }
  w[id] = u;
}
struct bit_tree {
  long long c[maxn], n;
  void init(int x) { n = x; }
  inline int lowbit(int x) { return x & (-x); }
  inline void update(int x, int v) {
    for (int i = x; i <= n; i += lowbit(i)) {
      c[i] += v;
    }
  }
  inline long long query(int x) {
    long long ans = 0;
    for (int i = x; i > 0; i -= lowbit(i)) ans += c[i];
    return ans;
  }
} T;
void ac() {
  queue<int> q;
  for (int i = 0; i < 26; i++) {
    if (tr[0][i]) q.push(tr[0][i]), fail[tr[0][i]] = 0;
  }
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (int i = 0; i < 26; i++) {
      if (tr[u][i]) {
        fail[tr[u][i]] = tr[fail[u]][i];
        q.push(tr[u][i]);
      } else {
        tr[u][i] = tr[fail[u]][i];
      }
    }
  }
}
int ins[maxn], out[maxn], cnt = 0;
int vis[maxn];
void dfs(int x) {
  ins[x] = ++cnt;
  for (int i : g[x]) dfs(i);
  out[x] = cnt;
}
int main() {
  cin >> q >> n;
  for (int i = 1; i <= n; i++) {
    cin >> s;
    add(s, i);
  }
  ac();
  for (int i = 1; i <= tot; i++) {
    g[fail[i]].push_back(i);
  }
  dfs(0);
  T.init(cnt);
  for (int i = 1; i <= n; i++) {
    vis[i] = 1;
    T.update(ins[w[i]], 1);
    T.update(out[w[i]] + 1, -1);
  }
  char c;
  int id;
  while (q--) {
    cin >> c;
    if (c == '+') {
      cin >> id;
      if (vis[id]) continue;
      vis[id] = 1;
      T.update(ins[w[id]], 1);
      T.update(out[w[id]] + 1, -1);
    } else if (c == '-') {
      cin >> id;
      if (!vis[id]) continue;
      vis[id] = 0;
      T.update(ins[w[id]], -1);
      T.update(out[w[id]] + 1, +1);
    } else {
      cin >> s;
      int m = strlen(s);
      long long p = 0, ans = 0;
      for (int i = 0; i < m; i++) {
        p = tr[p][s[i] - 'a'];
        ans += T.query(ins[p]);
      }
      printf("%lld\n", ans);
    }
  }
  return 0;
}
