#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;   }   