#include <bits/stdc++.h>
using namespace std;
const double PI = acos((double)-1);
int ts, ts2;
int n, m, K;
long long gcd(long long x, long long y) {
  long long t;
  for (; y != 0;) {
    t = x % y;
    x = y;
    y = t;
  }
  return x;
}
string name[100005];
char ss[1000005];
vector<int> tof[1000005];
int qu[1000005], dy[1000005];
int isin[100005];
struct AC {
  struct node {
    int ch[27], count, fa, fail, c;
    node() { count = 0; }
  } a[1000005];
  int a2;
  AC() { a2 = 0; }
  void create(int x) {
    int i, j, t1;
    t1 = 0;
    for (i = 0; i < name[x].size(); i++) {
      char c1 = name[x][i] - 96;
      if (a[t1].ch[c1] == 0) {
        a[t1].ch[c1] = ++a2;
        a[a2].fa = t1;
        a[a2].c = c1;
      }
      t1 = a[t1].ch[c1];
    }
    dy[x] = t1;
  }
  void getFail() {
    int i, j, k, t1, t2, t3, t4, t5, t, le, ri;
    le = ri = 1;
    qu[1] = 0;
    for (; le <= ri; le++) {
      i = qu[le];
      for (t1 = a[a[i].fa].fail;; t1 = a[t1].fail) {
        if (a[t1].ch[a[i].c] != 0) {
          a[i].fail = a[t1].ch[a[i].c];
          break;
        }
        if (t1 == 0) {
          a[i].fail = 0;
          break;
        }
      }
      if (a[i].fa == 0) a[i].fail = 0;
      tof[a[i].fail].push_back(i);
      for (j = 1; j <= 26; j++) {
        if (a[i].ch[j] == 0) continue;
        qu[++ri] = a[i].ch[j];
      }
    }
  }
  void DFS(int x, int v) {
    a[x].count += v;
    for (vector<int>::iterator it = tof[x].begin(); it != tof[x].end(); it++)
      DFS(*it, v);
  }
  void add(int x, int v) {
    int i, j, k, t1, t2, t3, t4, t5, t;
    t1 = dy[x];
    DFS(t1, v);
  }
  long long go(char *s) {
    long long i, j, k, t1, t2, t3, t4, t5, t, len = strlen(s), nw, ans = 0;
    t1 = 0;
    for (i = 0; i < len; i++) {
      nw = s[i] - 96;
      for (;; t1 = a[t1].fail) {
        if (a[t1].ch[nw] != 0) {
          t1 = a[t1].ch[nw];
          break;
        }
        if (t1 == 0) {
          t1 = 0;
          break;
        }
      }
      ans += a[t1].count;
    }
    return ans;
  }
} ac;
int main() {
  int i, j, k, t1, t2, t3, t4, t5, t;
  double u1, u2, u3, u4, u5;
  char c1, c2, c3;
  srand((unsigned)time(0));
  scanf("%d%d", &n, &K);
  for (i = 1; i <= K; i++) {
    scanf("%s", ss);
    name[i] = ss;
  }
  for (i = 1; i <= K; i++) ac.create(i);
  ac.getFail();
  for (i = 1; i <= K; i++) ac.add(i, 1), isin[i] = 1;
  for (i = 1; i <= n; i++) {
    scanf("%c", &c1);
    if (c1 == '+') {
      scanf("%d", &t1);
      if (!isin[t1]) {
        isin[t1] = 1;
        ac.add(t1, 1);
      }
    } else if (c1 == '-') {
      scanf("%d", &t1);
      if (isin[t1]) {
        isin[t1] = 0;
        ac.add(t1, -1);
      }
    } else if (c1 == '?') {
      scanf("%s", ss);
      long long ttt = ac.go(ss);
      printf("%I64d\n", ttt);
    } else {
      i--;
      continue;
    }
  }
  return 0;
}
