DEBUG = False


def get_pos(index):
    """初期位置indexのロボットのクエリ後の配置を返す
    is_whick_sideの返り値として返す"""
    if DEBUG: print()
    iws = is_whick_side(index)
    if iws != 0:
        if DEBUG: print(iws)
        return iws
    for t, d in e:
        if DEBUG: print(index, s[index], t, d, end='')
        if t == s[index]:
            if d == 'R':
                index += 1
            else:
                index -= 1
        if DEBUG: print('->', index, s[index] if 0 <= index < N else '==Removed')
        iws = is_whick_side(index)
        if iws != 0:
            if DEBUG: print(iws)
            return iws
    if DEBUG: print(0)
    return 0


def is_whick_side(index):
    if index == -1:
        return -1
        # 左消滅
    elif index == N:
        return 1
        # 右消滅
    else:
        return 0
        # 非消滅
    # 二分探索中に左右どちらから消滅したか把握しておかないと
    # midの初期値が消滅だった場合に
    # indexの-1側,N側どちら側に次の探索範囲を設ければよいのか判断できない


N, Q = map(int, input().split())
s = input()

e = [input().split() for _ in range(Q)]
# t: 文字 <- siと比較
# d: 'L', 'R'

# right
left = -1
right = N
while right - left > 1:
    mid = (left + right) // 2
    if get_pos(mid) == 1:
        # 右消滅
        right = mid
    else:
        left = mid
    if DEBUG: print('lr', left, right)
ar = right
if DEBUG: print('right', ar)
# 右消滅開始位置

# left
left = -1
right = N
while right - left > 1:
    mid = (left + right) // 2
    if get_pos(mid) == -1:
        left = mid
    else:
        right = mid
    if DEBUG: print('lr', left, right)
al = left
if DEBUG: print('left', al)
# 左消滅開始位置
# (al, ar) = 残存区間

print((ar - 1) - (al + 1) + 1)
