/*
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
*/
#include<bits/stdc++.h>
#define ALL(x) (x).begin(),(x).end()
#define ll long long
#define db double
#define ull unsigned long long
#define pii_ pair<int,int>
#define mp_ make_pair
#define pb push_back
#define fi first
#define se second
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define show1(a) cout<<#a<<" = "<<a<<endl
#define show2(a,b) cout<<#a<<" = "<<a<<"; "<<#b<<" = "<<b<<endl
using namespace std;
const ll INF = 1LL<<60;
const int inf = 1<<30;
const int maxn = 2e5+5;
const int M = 1e9+7;
inline void fastio() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);}
char s[maxn];
int n,q;
struct Matrix
{
    ll mat[2][2];
    Matrix() {memset(mat,0,sizeof(mat));}
    Matrix operator * (const Matrix other) const
    {
        Matrix product;
        rep(i,0,1)rep(j,0,1)rep(k,0,1) product.mat[i][j] = (product.mat[i][j] + mat[i][k] * other.mat[k][j])%M;
        return product;
    }
}tr[maxn<<2];
void push_up(int id)
{
    tr[id] = tr[id<<1] * tr[id<<1|1];
}
void build(int id,int l,int r)
{
    if(l==r){
        if(s[n-l+1]=='A' || s[n-l+1]=='E' || s[n-l+1]=='I' || s[n-l+1]=='O' || s[n-l+1]=='U'){
            tr[id].mat[0][1] = tr[id].mat[1][0] = 1;
        }else if(s[n-l+1]=='H'){
            tr[id].mat[0][0] = tr[id].mat[0][1] = 1;
        }else if(s[n-l+1]=='S' || s[n-l+1]=='D'){
            tr[id].mat[1][0] = tr[id].mat[1][1] = 1;
        }else if(s[n-l+1]=='?'){
            tr[id].mat[0][0] = 19,tr[id].mat[0][1] = 6;
            tr[id].mat[1][0] = 7,tr[id].mat[1][1] = 20;
        }else {
            tr[id].mat[0][0] = tr[id].mat[1][1] = 1;
        }
        return ;
    }
    int mid = (l+r)>>1;
    build(id<<1,l,mid);build(id<<1|1,mid+1,r);
    push_up(id);
}
void update(int id,int stl,int str,int pos,char o)
{
    if(stl==str){
        memset(tr[id].mat,0,sizeof(tr[id].mat));
        if(o=='A' || o=='E' || o=='I' || o=='O' || o=='U'){
            tr[id].mat[0][1] = tr[id].mat[1][0] = 1;
        }else if(o=='H'){
            tr[id].mat[0][0] = tr[id].mat[0][1] = 1;
        }else if(o=='S' || o=='D'){
            tr[id].mat[1][0] = tr[id].mat[1][1] = 1;
        }else if(o=='?'){
            tr[id].mat[0][0] = 19,tr[id].mat[0][1] = 6;
            tr[id].mat[1][0] = 7,tr[id].mat[1][1] = 20;
        }else {
            tr[id].mat[0][0] = tr[id].mat[1][1] = 1;
        }
        return ;
    }
    int mid = (stl+str)>>1;
    if(pos<=mid) update(id<<1,stl,mid,pos,o);
    else update(id<<1|1,mid+1,str,pos,o);
    push_up(id);
}
int main()
{
    fastio();
    cin>>n>>q>>s+1;
    build(1,1,n);
    cout<<tr[1].mat[0][0]<<endl;
    while(q--){ int pos;char o;
        cin>>pos>>o;
        update(1,1,n,n-pos+1,o);
        cout<<tr[1].mat[0][0]<<endl;
    }
    return 0;
}