var lines = [];
var readline = require('readline');

var rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
});

rl.on('line', function (x) {
    lines.push(x);
})

rl.on('close', function () {
    var tmp = lines.shift().split(" ");
    var N = Number(tmp[0]); var Q = Number(tmp[1]);
    var T = Array(Q); var D = Array(Q);

    var golem = {};
    var S = lines.shift().split("");

    for (var i = 0; i < N; i++) {
        golem[i] = {
            now: i,
            alphabet: S[i],
        }
    }

    for (var i = 0; i < Q; i++) {
        tmp = lines[i].split(" ");
        T[i] = tmp[0]; D[i] = tmp[1];
    }

    // ゴーレムを左へ移動
    var left = 0; var right = N - 1; var ave_L = -1; var disapper = false;
    
    // 調査するマスが変化しなくなったら終了
    while (ave_L !== Math.floor((left + right) / 2)) {
        ave_L = Math.floor((left + right) / 2);

        for (var j = 0; j < Q; j++) {
            if (D[j] === "L" && golem[ave_L].alphabet === T[j]) { golem[ave_L].now--; golem[ave_L].alphabet = S[golem[ave_L].now] }
            if (D[j] === "R" && golem[ave_L].alphabet === T[j]) { golem[ave_L].now++; golem[ave_L].alphabet = S[golem[ave_L].now] }

            // ゴーレムが0よりも左のマスへ移動した場合，break
            if (golem[ave_L].now < 0) { left = ave_L; right = right; disapper = true; break; }
            
            // ゴーレムが0よりも左のマスへ移動しない場合
            if (j === Q - 1) { left = left; right = ave_L; }
        }
    }
    // ゴーレムが消えない場合
    if (disapper === false) { ave_L--; }


    // ゴーレムを右へ移動
    var left = 0; var right = N - 1; var ave_R = -1; var disapper = false;
    
    // 調査するマスが変化しなくなったら終了
    while (ave_R !== Math.ceil((left + right) / 2)) {
        ave_R = Math.ceil((left + right) / 2);

        for (var j = 0; j < Q; j++) {
            if (D[j] === "L" && golem[ave_R].alphabet === T[j]) { golem[ave_R].now--; golem[ave_R].alphabet = S[golem[ave_R].now] }
            if (D[j] === "R" && golem[ave_R].alphabet === T[j]) { golem[ave_R].now++; golem[ave_R].alphabet = S[golem[ave_R].now] }

            // ゴーレムがN-1よりも右のマスへ移動した場合，break
            if (N - 1 < golem[ave_R].now) { left = left; right = ave_R; disapper = true; break; }

            // ゴーレムがN-1よりも右のマスへ移動しない場合
            if (j === Q - 1) { left = ave_R; right = right; }
        }
    }
    // ゴーレムが消えない場合
    if (disapper === false) { ave_R++; }
    console.log(N - (N - ave_R + ave_L) - 1);
});
