/*
#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;
}