using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ExaWizards2019C2
{
    class Program
    {
            public static int max = (int)Math.Pow(10, 6);//大きな数字
            public static int min = -1;
        static void Main(string[] args)
        {
            // スペース区切りの整数の入力
            string[] input = Console.ReadLine().Split(' ');
            int N = int.Parse(input[0]);//マスの数
            int Q = int.Parse(input[1]);//呪文の数
            // 文字列の入力
            string letter =Console.ReadLine();
            List<string> character = new List<string>();
            for (int i = 0; i < N; i++)
            {
                character.Add(letter.Substring(i, 1));
            }
            //呪文の入力
            string[] magic = new string[Q];
            for (int i = 0; i < Q; i++)
            {
                magic[i] = Console.ReadLine();
            }
            //何番目の呪文で使われたかを記録する
            //Rについて
            List<int>[] used_List_R = new List<int>[N];
            List<int>[] used_List_L = new List<int>[N];
            for (int i = 0; i < N; i++)
            {
                used_List_R[i] = new List<int>();
                used_List_L[i] = new List<int>();
                used_List_R[i].Add(max);//大きい数字を入れておく
                used_List_L[i].Add(max);
            }
            for (int i = 0; i < Q; i++)
            {
                for (int j = 0; j < N; j++)
                {
                if((magic[i].Substring(2,1)=="R")&&(magic[i].Substring(0,1)==character[j]))
                    {
                        used_List_R[j].Remove(max);
                        used_List_R[j].Add(i);
                    }
                if ((magic[i].Substring(2, 1) == "L") && (magic[i].Substring(0, 1) == character[j]))
                    {
                        used_List_L[j].Remove(max);
                        used_List_L[j].Add(i);
                    }
                }
            }
/*
            foreach(List<int> member in used_List_R)
            {
                foreach(int ns in member)
                {
                    Console.Write(ns+" ");
                }
                Console.WriteLine();
            }
*/
            //R　どこまでが消せるか
            int counter_RR = 0;
            int ansR = 0;
            if (used_List_R[used_List_R.Count()-1].Contains(max))
            {
                ansR = 0;
            }
            else
            {
                for (int i = N-1; i >=0; i--)
                {
                    if (used_List_R[i].Contains(max))
                    {
                        break;
                    }
                    for (int j = 0; j < Q; j++)
                    {
                        if (used_List_R[i].Contains(j)==true)
                            {
                                counter_RR+=check_R(i,j,N,used_List_R);
                                if (counter_RR > 1) counter_RR = 1;
                            }
                    }
                if (counter_RR == 1) ansR++;
                //Console.WriteLine(i+" "+counter_RR);
                counter_RR = 0;
                }
            }

           // Console.WriteLine("ansR="+ansR);
            //L　どこまで消せるか
            int counter_LL = 0;
            int ansL = 0;
            if (used_List_L[0].Contains(max))
            {
                ansL = 0;
            }
            else
            {
                for (int i = 0; i < N; i++)
                {
                    if (used_List_L[i].Contains(max))
                    {
                        break;
                    }
                    for (int j = 0; j < Q; j++)
                    {
                    if (used_List_L[i].Contains(j) == true)
                        {
                        counter_LL += check_L(i, j, N, used_List_L);
                        if (counter_LL > 1) counter_LL = 1;
                        }
                    }
                if (counter_LL == 1) ansL++;
                //Console.WriteLine(i+" "+counter_LL);
                 counter_LL = 0;
                }
            }
            //Console.WriteLine("ansL="+ansL);
            Console.WriteLine(N-ansR-ansL);
        }
        public static int check_L(int i,int j,int N,List<int>[] used_List_L)
        {
           int counter_L = 0;
            if (i == 0)
            {
                return 1;
            }else if (i == N - 1)
            {
                return 0;
            }
            else
            {
                int x = i + 1;//右隣のマス
                foreach(int num in used_List_L[x])
                {
                    if(num < j)//右隣のマスに大きな呪文番号があるなら
                    {
                        counter_L = 1;
                        break;
                    }
                }
                return counter_L;
            }
        }
        //指定されたマスの右横に大きな数字が入っているか
        // i 今見ているマス　j今見ているマスの呪文番号
        public static int check_R(int i,int j,int N,List<int>[] used_List_R)
        {
            int counter_R = 0;
            if (i == N-1)
            {
                return 1;
            }
            else
            {
                int x = i + 1;//右隣のマス
                foreach(int num in used_List_R[x])
                {
                    if((num > j)&&(num!=max))//右隣のマスに大きな呪文番号があるなら
                    {
                        counter_R = 1;
                        break;
                    }
                }
                return counter_R;
            }
        }
    }
}
