#include <bits/stdc++.h>
using namespace std;
const int MX = 1000005;
vector<int> neigh[MX];
int id[MX];
int tin[MX];
int tout[MX];
void dfs(int v, int d = 0) {
  static int t = 0;
  tin[v] = ++t;
  for (int u : neigh[v]) dfs(u, d + 1);
  tout[v] = ++t;
}
int fwt[3 * MX];
void fwt_add(int i, int d) {
  while (i < 3 * MX) {
    fwt[i] += d;
    i += i & -i;
  }
}
int fwt_get(int i) {
  int s = 0;
  while (i) {
    s += fwt[i];
    i -= i & -i;
  }
  return s;
}
struct {
  int link;
  int to[26];
} T[MX];
int tsz = 1;
bool taken[MX];
int main() {
  int n, k;
  ignore = scanf("%d %d", &n, &k);
  for (int i = 1; i <= k; i++) {
    static char s[MX];
    ignore = scanf(" %s", s);
    int len = strlen(s);
    int cur = 0;
    for (int j = 0; j < len; j++) {
      if (T[cur].to[s[j] - 'a'] == 0) {
        int nxt = tsz++;
        T[cur].to[s[j] - 'a'] = nxt;
      }
      cur = T[cur].to[s[j] - 'a'];
    }
    id[i] = cur;
  }
  {
    static int Q[MX];
    int L = 0, R = 0;
    Q[R++] = 0;
    while (L < R) {
      int cur = Q[L++];
      for (int c = 0; c < 26; c++) {
        int nxt = T[cur].to[c];
        if (nxt == 0) continue;
        Q[R++] = nxt;
        if (cur > 0) {
          int l = T[cur].link;
          while (l && T[l].to[c] == 0) {
            l = T[l].link;
          }
          if (T[l].to[c]) l = T[l].to[c];
          T[nxt].link = l;
        }
        neigh[T[nxt].link].push_back(nxt);
      }
    }
  }
  dfs(0);
  for (int i = 1; i <= k; i++) {
    fwt_add(tin[id[i]], 1);
    fwt_add(tout[id[i]], -1);
    taken[i] = true;
  }
  while (n--) {
    char c;
    ignore = scanf(" %c", &c);
    if (c == '+') {
      int i;
      ignore = scanf("%d", &i);
      if (!taken[i]) {
        fwt_add(tin[id[i]], 1);
        fwt_add(tout[id[i]], -1);
        taken[i] = true;
      }
    } else if (c == '-') {
      int i;
      ignore = scanf("%d", &i);
      if (taken[i]) {
        fwt_add(tin[id[i]], -1);
        fwt_add(tout[id[i]], 1);
        taken[i] = false;
      }
    } else {
      static char s[MX];
      ignore = scanf("%s", s);
      int len = strlen(s);
      int cur = 0;
      long long res = 0;
      for (int i = 0; i < len; i++) {
        while (cur && T[cur].to[s[i] - 'a'] == 0) {
          cur = T[cur].link;
        }
        if (T[cur].to[s[i] - 'a']) cur = T[cur].to[s[i] - 'a'];
        res += fwt_get(tin[cur]);
      }
      printf("%lld\n", res);
    }
  }
}
