#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
const int N = 2e5, oo = 2e18, MOD = 1e9+7;
typedef array<int, 4> mat;
mat mul(const mat& a, const mat& b) {
mat ret;
ret[0] = (a[0] * b[0] % MOD + a[1] * b[2] % MOD) % MOD;
ret[1] = (a[0] * b[1] % MOD + a[1] * b[3] % MOD) % MOD;
ret[2] = (a[2] * b[0] % MOD + a[3] * b[2] % MOD) % MOD;
ret[3] = (a[2] * b[1] % MOD + a[3] * b[3] % MOD) % MOD;
return ret;
}
class segtree {
public:
struct Node {
mat data;
Node() {
data[0] = data[3] = 1;
}
void update(char c) {
switch (c)
{
case 'H':
data = {1, 0, 1, 0};
break;
case 'S':
case 'D':
data = {0, 1, 0, 1};
break;
case '?':
data = {19, 7, 6, 20};
break;
case 'A':
case 'E':
case 'O':
case 'U':
case 'I':
data = {0, 1, 1, 0};
break;
default:
data = {1, 0, 0, 1};
break;
}
}
Node(char c) {
update(c);
}
};
Node merge(const Node& a, const Node& b) {
Node ret;
ret.data = mul(a.data, b.data);
return ret;
}
int tree_size;
vector<Node> tree;
segtree(int n) {
tree_size = 1;
while (tree_size < n) tree_size *= 2;
tree = vector<Node>(tree_size * 2);
}
void update(int idx, char c, int nx = 0, int lx = 0, int rx = -1){
if (rx == -1)
rx = tree_size;
if (rx - lx == 1) {
tree[nx].update(c);
return;
}
int mid = (lx + rx) / 2;
if (idx < mid) {
update(idx, c, 2 * nx + 1, lx, mid);
} else {
update(idx, c, 2 * nx + 2, mid, rx);
}
tree[nx] = merge(tree[2 * nx + 1], tree[2 * nx + 2]);
}
};
void solve() {
int n, q; cin >> n >> q;
string s; cin >> s;
segtree st(n);
for (int i = 0; i < n; i++) {
st.update(i, s[i]);
}
cout << st.tree[0].data[0] << endl;
while (q--) {
int x; cin >> x;
char c; cin >> c;
st.update(x -1, c);
cout << st.tree[0].data[0] << endl;
}
}
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
// #ifndef ONLINE_JUDGE
// freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
// #endif
int t; t = 1;
// cin >> t;
while (t--) solve();
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIGVuZGwgICAgICdcbicKI2RlZmluZSBpbnQgICAgICBsb25nIGxvbmcKCmNvbnN0IGludCBOID0gMmU1LCBvbyA9IDJlMTgsIE1PRCA9IDFlOSs3OwoKdHlwZWRlZiBhcnJheTxpbnQsIDQ+IG1hdDsKCm1hdCBtdWwoY29uc3QgbWF0JiBhLCBjb25zdCBtYXQmIGIpIHsKICAgIG1hdCByZXQ7CiAgICByZXRbMF0gPSAoYVswXSAqIGJbMF0gJSBNT0QgKyBhWzFdICogYlsyXSAlIE1PRCkgJSBNT0Q7CiAgICByZXRbMV0gPSAoYVswXSAqIGJbMV0gJSBNT0QgKyBhWzFdICogYlszXSAlIE1PRCkgJSBNT0Q7CiAgICByZXRbMl0gPSAoYVsyXSAqIGJbMF0gJSBNT0QgKyBhWzNdICogYlsyXSAlIE1PRCkgJSBNT0Q7CiAgICByZXRbM10gPSAoYVsyXSAqIGJbMV0gJSBNT0QgKyBhWzNdICogYlszXSAlIE1PRCkgJSBNT0Q7CiAgICByZXR1cm4gcmV0Owp9CgpjbGFzcyBzZWd0cmVlIHsgCnB1YmxpYzoKICAgIHN0cnVjdCBOb2RlIHsKICAgICAgICBtYXQgZGF0YTsKICAgICAgICBOb2RlKCkgewogICAgICAgICAgICBkYXRhWzBdID0gZGF0YVszXSA9IDE7CiAgICAgICAgfQogICAgICAgIHZvaWQgdXBkYXRlKGNoYXIgYykgewogICAgICAgICAgICBzd2l0Y2ggKGMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgY2FzZSAnSCc6CiAgICAgICAgICAgICAgICBkYXRhID0gezEsIDAsIDEsIDB9OwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ1MnOgogICAgICAgICAgICBjYXNlICdEJzoKICAgICAgICAgICAgICAgIGRhdGEgPSB7MCwgMSwgMCwgMX07CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnPyc6CiAgICAgICAgICAgICAgICBkYXRhID0gezE5LCA3LCA2LCAyMH07CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnQSc6CiAgICAgICAgICAgIGNhc2UgJ0UnOgogICAgICAgICAgICBjYXNlICdPJzoKICAgICAgICAgICAgY2FzZSAnVSc6CiAgICAgICAgICAgIGNhc2UgJ0knOgogICAgICAgICAgICAgICAgZGF0YSA9IHswLCAxLCAxLCAwfTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIGRhdGEgPSB7MSwgMCwgMCwgMX07CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBOb2RlKGNoYXIgYykgewogICAgICAgICAgICB1cGRhdGUoYyk7CiAgICAgICAgfQogICAgfTsKICAgIE5vZGUgbWVyZ2UoY29uc3QgTm9kZSYgYSwgY29uc3QgTm9kZSYgYikgewogICAgICAgIE5vZGUgcmV0OwogICAgICAgIHJldC5kYXRhID0gbXVsKGEuZGF0YSwgYi5kYXRhKTsKICAgICAgICByZXR1cm4gcmV0OwogICAgfQogICAgaW50IHRyZWVfc2l6ZTsKICAgIHZlY3RvcjxOb2RlPiB0cmVlOwogICAgc2VndHJlZShpbnQgbikgIHsKICAgICAgICB0cmVlX3NpemUgPSAxOwogICAgICAgIHdoaWxlICh0cmVlX3NpemUgPCBuKSB0cmVlX3NpemUgKj0gMjsKICAgICAgICB0cmVlID0gdmVjdG9yPE5vZGU+KHRyZWVfc2l6ZSAqIDIpOwogICAgfQogICAgdm9pZCB1cGRhdGUoaW50IGlkeCwgY2hhciBjLCBpbnQgbnggPSAwLCBpbnQgbHggPSAwLCBpbnQgcnggPSAtMSl7CiAgICAgICAgaWYgKHJ4ID09IC0xKQogICAgICAgICAgICByeCA9IHRyZWVfc2l6ZTsKICAgICAgICBpZiAocnggLSBseCA9PSAxKSB7CiAgICAgICAgICAgIHRyZWVbbnhdLnVwZGF0ZShjKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpbnQgbWlkID0gKGx4ICsgcngpIC8gMjsKICAgICAgICBpZiAoaWR4IDwgbWlkKSB7CiAgICAgICAgICAgIHVwZGF0ZShpZHgsIGMsIDIgKiBueCArIDEsIGx4LCBtaWQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHVwZGF0ZShpZHgsIGMsIDIgKiBueCArIDIsIG1pZCwgcngpOwogICAgICAgIH0KICAgICAgICB0cmVlW254XSA9IG1lcmdlKHRyZWVbMiAqIG54ICsgMV0sIHRyZWVbMiAqIG54ICsgMl0pOwogICAgfQp9OwoKCnZvaWQgc29sdmUoKSB7CiAgICBpbnQgbiwgcTsgY2luID4+IG4gPj4gcTsKICAgIHN0cmluZyBzOyBjaW4gPj4gczsKICAgIHNlZ3RyZWUgc3Qobik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIHN0LnVwZGF0ZShpLCBzW2ldKTsKICAgIH0KCiAgICBjb3V0IDw8IHN0LnRyZWVbMF0uZGF0YVswXSA8PCBlbmRsOwogICAgd2hpbGUgKHEtLSkgewogICAgICAgIGludCB4OyBjaW4gPj4geDsKICAgICAgICBjaGFyIGM7IGNpbiA+PiBjOwogICAgICAgIHN0LnVwZGF0ZSh4IC0xLCBjKTsKICAgICAgICBjb3V0IDw8IHN0LnRyZWVbMF0uZGF0YVswXSA8PCBlbmRsOwoKICAgIH0KfQoKCnNpZ25lZCBtYWluKCkgewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7IAogICAgY2luLnRpZShOVUxMKTsgY291dC50aWUoTlVMTCk7CiAgICAvLyAjaWZuZGVmIE9OTElORV9KVURHRSAKICAgIC8vICAgIGZyZW9wZW4oImlucHV0LnR4dCIsICJyIiwgc3RkaW4pOyAKICAgIC8vICAgIGZyZW9wZW4oIm91dHB1dC50eHQiLCAidyIsIHN0ZG91dCk7IAogICAgLy8gI2VuZGlmIAogICAgaW50IHQ7IHQgPSAxOwogICAgLy8gY2luID4+IHQ7CiAgICB3aGlsZSAodC0tKSBzb2x2ZSgpOwogICAgcmV0dXJuIDA7Cn0K