#include <bits/stdc++.h>
using namespace std;
int zeit = 0;
struct kn {
  kn *nach[26];
  kn *vor;
  int vori;
  kn *pi;
  vector<kn *> rpi;
  int s, e;
  kn(kn *vo, int voi) {
    vor = vo;
    vori = voi;
    for (int i = 0; i < (26); i++) {
      nach[i] = 0;
    }
    pi = 0;
  }
  void init() {
    if (!vor) {
      for (int i = 0; i < (26); i++)
        if (!nach[i]) nach[i] = this;
    } else {
      if (vor->pi)
        pi = vor->pi->nach[vori];
      else
        pi = vor;
      pi->rpi.push_back(this);
      for (int i = 0; i < (26); i++)
        if (!nach[i]) nach[i] = pi->nach[i];
    }
  }
  void suche2() {
    s = zeit++;
    for (typeof((rpi).begin()) p = (rpi).begin(); p != (rpi).end(); p++)
      (*p)->suche2();
    e = zeit;
  }
};
int Q, K;
char name[1000010];
kn *person[100000];
bool drin[100000];
struct fenwick {
  int N;
  vector<long long> fen;
  fenwick(int n) {
    N = n;
    fen.assign(N + 2, 0);
  }
  void add(int i, int d) {
    i++;
    while (i <= N + 1) {
      fen[i] += d;
      i += i & -i;
    }
  }
  long long sum(int i) {
    i++;
    long long r = 0;
    while (i) {
      r += fen[i];
      i -= i & -i;
    }
    return r;
  }
};
int main() {
  scanf("%d%d ", &Q, &K);
  kn *sk = new kn(0, 0);
  for (int i = 0; i < (K); i++) {
    scanf("%s ", name);
    kn *k = sk;
    for (int p = 0; name[p]; p++) {
      if (!k->nach[name[p] - 'a'])
        k->nach[name[p] - 'a'] = new kn(k, name[p] - 'a');
      k = k->nach[name[p] - 'a'];
    }
    person[i] = k;
  }
  queue<kn *> qu;
  qu.push(sk);
  while (!qu.empty()) {
    kn *k = qu.front();
    qu.pop();
    k->init();
    for (int i = 0; i < (26); i++) {
      if (k->nach[i]->vor == k) qu.push(k->nach[i]);
    }
  }
  sk->suche2();
  fenwick f(zeit);
  for (int i = 0; i < (K); i++) {
    f.add(person[i]->e, -1);
    f.add(person[i]->s, +1);
    drin[i] = true;
  }
  for (int ru = 0; ru < (Q); ru++) {
    char typ;
    scanf("%c", &typ);
    if (typ == '+' || typ == '-') {
      int i;
      scanf("%d ", &i);
      i--;
      bool h = (typ == '+');
      if (drin[i] != h) {
        f.add(person[i]->e, h ? -1 : +1);
        f.add(person[i]->s, h ? +1 : -1);
        drin[i] = h;
      }
    } else {
      long long erg = 0;
      scanf("%s ", name);
      kn *k = sk;
      for (int p = 0; name[p]; p++) {
        k = k->nach[name[p] - 'a'];
        erg += f.sum(k->s);
      }
      printf("%I64d\n", erg);
    }
  }
  return 0;
}
