#include <bits/stdc++.h>
using namespace std;
int nxt[26][1010100];
int best[255][255][255];
string s;
int N, M;
string sa[3];
void update(int a1, int a2, int b1, int b2, int c1, int c2) {
  for (int a = a1; a <= a2; ++a) {
    for (int b = b1; b <= b2; ++b) {
      for (int c = c1; c <= c2; ++c) {
        best[a][b][c] = N + 1;
        if (a == b && b == c && c == 0) {
          best[a][b][c] = 0;
          continue;
        }
        if (a) {
          int cr = sa[0][a - 1] - 'a';
          int val = nxt[cr][best[a - 1][b][c]];
          best[a][b][c] = min(best[a][b][c], val);
        }
        if (b) {
          int cr = sa[1][b - 1] - 'a';
          int val = nxt[cr][best[a][b - 1][c]];
          best[a][b][c] = min(best[a][b][c], val);
        }
        if (c) {
          int cr = sa[2][c - 1] - 'a';
          int val = nxt[cr][best[a][b][c - 1]];
          best[a][b][c] = min(best[a][b][c], val);
        }
      }
    }
  }
}
int main() {
  cin >> N >> M;
  cin >> s;
  for (int i = 0; i < (26); ++i)
    nxt[i][(int)(s).size()] = nxt[i][(int)(s).size() + 1] = (int)(s).size() + 1;
  for (int i = (int)(s).size() - 1; i >= 0; --i) {
    for (int j = 0; j < (26); ++j) nxt[j][i] = nxt[j][i + 1];
    nxt[s[i] - 'a'][i] = i + 1;
  }
  for (int i = 0; i < (M); ++i) {
    string s;
    int x;
    cin >> s >> x;
    --x;
    if (s == "-") {
      sa[x].pop_back();
    } else {
      string c;
      cin >> c;
      sa[x] += c;
      if (x == 0) {
        update((int)(sa[0]).size(), (int)(sa[0]).size(), 0, (int)(sa[1]).size(),
               0, (int)(sa[2]).size());
      } else if (x == 1) {
        update(0, (int)(sa[0]).size(), (int)(sa[1]).size(), (int)(sa[1]).size(),
               0, (int)(sa[2]).size());
      } else {
        update(0, (int)(sa[0]).size(), 0, (int)(sa[1]).size(),
               (int)(sa[2]).size(), (int)(sa[2]).size());
      }
    }
    if (best[(int)(sa[0]).size()][(int)(sa[1]).size()][(int)(sa[2]).size()] <=
        N) {
      cout << "YES\n";
    } else {
      cout << "NO\n";
    }
  }
}
