#include <bits/stdc++.h>
#define mp make_pair
#define all(vec) vec.begin(), vec.end()
using namespace std;
using ll = long long;
using P = pair<ll, ll>;
const ll INF = 1LL << 30;
const ll LINF = 1LL << 60;
const double eps = 1e-9;
const ll MOD = 998244353LL;
template <typename T>
void chmin(T& a, T b) {
    a = min(a, b);
};
template <typename T>
void chmax(T& a, T b) {
    a = max(a, b);
};
template <typename T>
vector<T> make_v(size_t a) {
    return vector<T>(a);
}
template <typename T, typename... Ts>
auto make_v(size_t a, Ts... ts) {
    return vector<decltype(make_v<T>(ts...))>(a, make_v<T>(ts...));
}
template <typename T, typename V>
typename enable_if<is_class<T>::value == 0>::type fill_v(T& t, const V& v) {
    t = v;
}
template <typename T, typename V>
typename enable_if<is_class<T>::value != 0>::type fill_v(T& t, const V& v) {
    for(auto& e : t) {
        fill_v(e, v);
    }
};
vector<char> t, d;
string s;
int n, q;
bool check(int pos) {
    bool f = false;
    for(int i = 0; i < q; i++) {
        if(s[pos] == t[i]) {
            if(d[i] == 'L') {
                pos--;
            } else {
                pos++;
            }
            if(pos == -1 || pos == n) {
                return true;
            }
        }
    }
    return false;
}
int main() {
    cin >> n >> q;
    cin >> s;
    t.resize(q), d.resize(q);
    for(int i = 0; i < q; i++) {
        cin >> t[i] >> d[i];
    }
    int ok = 0, ng = n;
    while(ng - ok > 1) {
        int mid = (ok + ng) / 2;
        if(check(mid)) {
            ok = mid;
        } else {
            ng = mid;
        }
    }
    int l = ok;
    if(!check(0)) {
        l = -1;
    }
    ok = n, ng = 0;
    while(ok - ng > 1) {
        int mid = (ok + ng) / 2;
        if(check(mid)) {
            ok = mid;
        } else {
            ng = mid;
        }
    }
    int r = ok;
    if(!check(n - 1)) {
        r = n;
    }
    cout << (l < r ? r - l - 1 : n) << endl;
}
