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

s = eval(input())

spells =  [input().split() for i in range(Q)]



def sim(pos, s, spells, N):

    for sp in spells:

        if s[pos] == sp[0]:

            pos += -1 if sp[1] == "L" else 1

            if pos < 0:

                return "LDead"

            if pos >= N:

                return "RDead"

    return "Alive"



#LD探し

Lpos = -1

Rpos = N

while Lpos+1<Rpos:

    pos = (Lpos+Rpos)//2

    if sim(pos, s, spells, N) == "LDead":

        Lpos = pos

    else:

        Rpos = pos

LDpos = Lpos ###LDeadの中で一番境界に近いもの



#RD探し

Lpos = -1

Rpos = N

while Lpos+1<Rpos:

    pos = (Lpos+Rpos)//2

    if sim(pos, s, spells, N) == "RDead":

        Rpos = pos

    else:

        Lpos = pos

RDpos = Rpos ###RDeadの中で一番境界に近いもの



print((max(0,RDpos-LDpos-1)))
N, Q = list(map(int, input().split()))

s = eval(input())

spells =  [input().split() for i in range(Q)]

### 逆順で落ちるゴーレムの位置を戻す

#落ちるゴーレムの端の位置

LDpos = -1

RDpos = N

for sp in spells[::-1]:

    if sp[1] == "L":

        if LDpos < N-1 and s[LDpos+1] == sp[0]:

            LDpos +=1 #LDposのゴーレムは1spell前には一つ右に居た

        if RDpos <= N-1 and s[RDpos] == sp[0]:

            RDpos +=1 #RDposの一つ左(生き残りの右端)は1spell前にこのマスに居れるので境界が一つ戻る

    else:

        if LDpos >= 0 and s[LDpos] == sp[0]:

            LDpos -=1 #LDposの一つ右(生き残りの左端)は1spell前にこのマスに居れるので境界が一つ戻る

        if RDpos > 0 and s[RDpos-1] == sp[0]:

            RDpos -= 1 #RDposのゴーレムは1spell前には一つ左に居た

print((max(RDpos-LDpos-1,0)))
N, Q = list(map(int, input().split()))
s = eval(input())
spells = [input().split() for i in range(Q)]


def sim(pos, s, spells, N):
    for sp in spells:
        if s[pos] == sp[0]:
            pos += -1 if sp[1] == "L" else 1
            if pos < 0:
                return "LDead"
            if pos >= N:
                return "RDead"
    return "Alive"


# LD探し
Lpos = -1
Rpos = N
while Lpos + 1 < Rpos:
    pos = (Lpos + Rpos) // 2
    if sim(pos, s, spells, N) == "LDead":
        Lpos = pos
    else:
        Rpos = pos
LDpos = Lpos  ###LDeadの中で一番境界に近いもの
# RD探し
Lpos = -1
Rpos = N
while Lpos + 1 < Rpos:
    pos = (Lpos + Rpos) // 2
    if sim(pos, s, spells, N) == "RDead":
        Rpos = pos
    else:
        Lpos = pos
RDpos = Rpos  ###RDeadの中で一番境界に近いもの
print((max(0, RDpos - LDpos - 1)))

N, Q = list(map(int, input().split()))
s = eval(input())
spells = [input().split() for i in range(Q)]
### 逆順で落ちるゴーレムの位置を戻す
# 落ちるゴーレムの端の位置
LDpos = -1
RDpos = N
for sp in spells[::-1]:
    if sp[1] == "L":
        if LDpos < N - 1 and s[LDpos + 1] == sp[0]:
            LDpos += 1  # LDposのゴーレムは1spell前には一つ右に居た
        if RDpos <= N - 1 and s[RDpos] == sp[0]:
            RDpos += 1  # RDposの一つ左(生き残りの右端)は1spell前にこのマスに居れるので境界が一つ戻る
    else:
        if LDpos >= 0 and s[LDpos] == sp[0]:
            LDpos -= 1  # LDposの一つ右(生き残りの左端)は1spell前にこのマスに居れるので境界が一つ戻る
        if RDpos > 0 and s[RDpos - 1] == sp[0]:
            RDpos -= 1  # RDposのゴーレムは1spell前には一つ左に居た
print((max(RDpos - LDpos - 1, 0)))

- - -def sim(pos, s, spells, N): -    for sp in spells: -        if s[pos] == sp[0]: -            pos += -1 if sp[1] == "L" else 1 -            if pos < 0: -                return "LDead" -            if pos >= N: -                return "RDead" -    return "Alive" - - -# LD探し -Lpos = -1 -Rpos = N -while Lpos + 1 < Rpos: -    pos = (Lpos + Rpos) // 2 -    if sim(pos, s, spells, N) == "LDead": -        Lpos = pos +### 逆順で落ちるゴーレムの位置を戻す +# 落ちるゴーレムの端の位置 +LDpos = -1 +RDpos = N +for sp in spells[::-1]: +    if sp[1] == "L": +        if LDpos < N - 1 and s[LDpos + 1] == sp[0]: +            LDpos += 1  # LDposのゴーレムは1spell前には一つ右に居た +        if RDpos <= N - 1 and s[RDpos] == sp[0]: +            RDpos += 1  # RDposの一つ左(生き残りの右端)は1spell前にこのマスに居れるので境界が一つ戻る -        Rpos = pos -LDpos = Lpos  ###LDeadの中で一番境界に近いもの -# RD探し -Lpos = -1 -Rpos = N -while Lpos + 1 < Rpos: -    pos = (Lpos + Rpos) // 2 -    if sim(pos, s, spells, N) == "RDead": -        Rpos = pos -    else: -        Lpos = pos -RDpos = Rpos  ###RDeadの中で一番境界に近いもの -print((max(0, RDpos - LDpos - 1))) +        if LDpos >= 0 and s[LDpos] == sp[0]: +            LDpos -= 1  # LDposの一つ右(生き残りの左端)は1spell前にこのマスに居れるので境界が一つ戻る +        if RDpos > 0 and s[RDpos - 1] == sp[0]: +            RDpos -= 1  # RDposのゴーレムは1spell前には一つ左に居た +print((max(RDpos - LDpos - 1, 0)))