#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const double EPS = 1e-8;
const double PI = acos(-1);
const int dy[] = {-1, 0, 1, 0};
const int dx[] = {0, 1, 0, -1};
template <class T>
bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}
template <typename Ch, typename Tr, typename C, typename = decltype(begin(C()))>
basic_ostream<Ch, Tr> &operator<<(basic_ostream<Ch, Tr> &os, const C &c) {
  os << '[';
  for (auto i = begin(c); i != end(c); ++i)
    os << (i == begin(c) ? "" : " ") << *i;
  return os << ']';
}
template <class S, class T>
ostream &operator<<(ostream &o, const pair<S, T> &t) {
  return o << '(' << t.first << ',' << t.second << ')';
}
template <int N, class Tp>
void output(ostream &, const Tp &) {}
template <int N, class Tp, class, class... Ts>
void output(ostream &o, const Tp &t) {
  if (N) o << ',';
  o << get<N>(t);
  output<N + 1, Tp, Ts...>(o, t);
}
template <class... Ts>
ostream &operator<<(ostream &o, const tuple<Ts...> &t) {
  o << '(';
  output<0, tuple<Ts...>, Ts...>(o, t);
  return o << ')';
}
template <class T>
void output(T t, char z = 10) {
  if (t < 0) t = -t, putchar(45);
  int c[20];
  int k = 0;
  while (t) c[k++] = t % 10, t /= 10;
  for (k || (c[k++] = 0); k;) putchar(c[--k] ^ 48);
  putchar(z);
}
template <class T>
void outputs(T t) {
  output(t);
}
template <class S, class... T>
void outputs(S a, T... t) {
  output(a, 32);
  outputs(t...);
}
template <class T>
void output(T *a, int n) {
  for (int i = 0; i < (int)(n); ++i) cout << a[i] << (i != n - 1 ? ',' : '\n');
}
template <class T>
void output(T *a, int n, int m) {
  for (int i = 0; i < (int)(n); ++i) output(a[i], m);
}
template <class T>
bool input(T &t) {
  int n = 1, c;
  for (t = 0; !isdigit(c = getchar()) && ~c && c - 45;)
    ;
  if (!~c) return 0;
  for (c - 45 && (n = 0, t = c ^ 48); isdigit(c = getchar());)
    t = 10 * t + c - 48;
  t = n ? -t : t;
  return 1;
}
template <class S, class... T>
bool input(S &a, T &...t) {
  input(a);
  return input(t...);
}
template <class T>
bool inputs(T *a, int n) {
  for (int i = 0; i < (int)(n); ++i)
    if (!input(a[i])) return 0;
  return 1;
}
char t[200000];
char d[200000];
int main() {
  int n, Q;
  while (cin >> n >> Q) {
    string s;
    cin >> s;
    for (int i = 0; i < (int)(Q); ++i) {
      cin >> t[i] >> d[i];
    }
    int low = -1, high = n;
    while (low + 1 < high) {
      int mid = (low + high) / 2;
      int x = mid;
      if (mid == -1) break;
      for (int i = 0; i < (int)(Q); ++i) {
        if (s[x] == t[i]) {
          if (d[i] == 'L') {
            x--;
          } else {
            x++;
          }
        }
        if (x == -1) break;
      }
      if (x == -1)
        low = mid;
      else
        high = mid;
    }
    int ans1 = low;
    low = 0, high = n + 1;
    while (low + 1 < high) {
      int mid = (low + high) / 2;
      int x = mid;
      if (mid == n) break;
      for (int i = 0; i < (int)(Q); ++i) {
        if (s[x] == t[i]) {
          if (d[i] == 'L') {
            x--;
          } else {
            x++;
          }
        }
        if (x == n) break;
      }
      if (x == n)
        high = mid;
      else
        low = mid;
    }
    int ans2 = high;
    cout << n - (ans1 + (n + 1 - ans2)) << endl;
  }
}
