#include <bits/stdc++.h>
using namespace std;
const double PI = 3.14159265359;
int n, k;
string word[1100100];
char txt[1100100];
int txtsz, wid;
int adj[1100100][26];
int mk[1100100];
int f[1100100];
vector<int> ch[1100100];
int wcnt[1100100];
int gid;
void dfs(int u, int add) {
  wcnt[u] += add;
  for (int(i) = (0); (i) < (ch[u].size()); (i)++) {
    int v = ch[u][i];
    dfs(v, add);
  }
}
int main() {
  scanf("%d %d\n", &n, &k);
  gid = 0;
  wcnt[0] = 0;
  mk[0] = 0;
  for (int(i) = (0); (i) < (26); (i)++) adj[0][i] = 0;
  for (int(i) = (0); (i) < (k); (i)++) {
    cin >> word[i];
    ;
    cin.ignore();
    int u = 0;
    for (int(p) = (0); (p) < (word[i].size()); (p)++) {
      int id = word[i][p] - 'a';
      if (!adj[u][id]) {
        adj[u][id] = ++gid;
        wcnt[gid] = 0;
        mk[gid] = 0;
        for (int(j) = (0); (j) < (26); (j)++) adj[gid][j] = 0;
      }
      u = adj[u][id];
    }
    wcnt[u] = 1;
    mk[u] = 1;
  }
  queue<int> q;
  f[0] = 0;
  for (int(i) = (0); (i) < (26); (i)++) {
    int u;
    if (u = adj[0][i]) {
      f[u] = 0;
      q.push(u);
    }
  }
  while (!q.empty()) {
    int e = q.front();
    q.pop();
    for (int(i) = (0); (i) < (26); (i)++) {
      int u;
      if (u = adj[e][i]) {
        q.push(u);
        int v = f[e];
        while (v && !adj[v][i]) v = f[v];
        f[u] = adj[v][i];
        wcnt[u] += wcnt[f[u]];
        ch[f[u]].push_back(u);
      }
    }
  }
  for (int(z) = (0); (z) < (n); (z)++) {
    char code;
    scanf("%c", &code);
    if (code == '?') {
      scanf("%s%n\n", txt, &txtsz);
      int cnt = 0;
      int u = 0;
      for (int(p) = (0); (p) < (txtsz); (p)++) {
        int id = txt[p] - 'a';
        while (u && !adj[u][id]) u = f[u];
        u = adj[u][id];
        cnt += wcnt[u];
      }
      printf("%d\n", cnt);
    }
    if (code == '-' || code == '+') {
      scanf("%d\n", &wid);
      wid--;
      int u = 0;
      for (int(p) = (0); (p) < (word[wid].size()); (p)++) {
        int id = word[wid][p] - 'a';
        u = adj[u][id];
      }
      if (code == '-' && mk[u]) {
        mk[u] = 0;
        dfs(u, -1);
      }
      if (code == '+' && !mk[u]) {
        mk[u] = 1;
        dfs(u, 1);
      }
    }
  }
  return 0;
}
