#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
const long double eps = 1e-7;
const int inf = 1000000010;
const long long INF = 10000000000000010LL;
const int mod = 1000000007;
const int MAXN = 100010, LOG = 20;
int n, m, k, u, v, x, y, t, a, b, ans;
int dp[251][251][251];
int sz[3];
vector<char> vec[3];
vector<int> pos[26];
string s;
char ch;
void print() {
  if (dp[sz[0]][sz[1]][sz[2]] <= n)
    cout << "YES\n";
  else
    cout << "NO\n";
}
int find_ch(int l, char c) {
  return *upper_bound(pos[c - 'a'].begin(), pos[c - 'a'].end(), l);
}
void update(int sz0, int sz1, int sz2) {
  dp[sz0][sz1][sz2] = n + 1;
  if (sz0)
    dp[sz0][sz1][sz2] =
        min(dp[sz0][sz1][sz2], find_ch(dp[sz0 - 1][sz1][sz2], vec[0][sz0 - 1]));
  if (sz1)
    dp[sz0][sz1][sz2] =
        min(dp[sz0][sz1][sz2], find_ch(dp[sz0][sz1 - 1][sz2], vec[1][sz1 - 1]));
  if (sz2)
    dp[sz0][sz1][sz2] =
        min(dp[sz0][sz1][sz2], find_ch(dp[sz0][sz1][sz2 - 1], vec[2][sz2 - 1]));
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m >> s;
  s = "." + s;
  for (int i = 1; i <= n; i++) pos[s[i] - 'a'].push_back(i);
  for (int i = 0; i < 26; i++) pos[i].push_back(inf);
  memset(dp, 31, sizeof(dp));
  dp[0][0][0] = 0;
  while (m--) {
    cin >> ch;
    if (ch == '-') {
      cin >> x;
      x--;
      vec[x].pop_back();
      sz[x]--;
      print();
      continue;
    }
    cin >> x >> ch;
    x--;
    vec[x].push_back(ch);
    sz[x]++;
    if (x == 0)
      for (int sz1 = 0; sz1 <= sz[1]; sz1++)
        for (int sz2 = 0; sz2 <= sz[2]; sz2++) update(sz[0], sz1, sz2);
    if (x == 1)
      for (int sz0 = 0; sz0 <= sz[0]; sz0++)
        for (int sz2 = 0; sz2 <= sz[2]; sz2++) update(sz0, sz[1], sz2);
    if (x == 2)
      for (int sz0 = 0; sz0 <= sz[0]; sz0++)
        for (int sz1 = 0; sz1 <= sz[1]; sz1++) update(sz0, sz1, sz[2]);
    print();
  }
  return 0;
}
