// عَجَبًا لأَمْرِ المُؤْمِنِ، إنَّ أمْرَهُ كُلَّهُ خَيْرٌ
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = double;
const char el = '\n';
const int MOD = 1e9 + 7;
const ll LIMIT = LLONG_MAX - 1ll * (MOD - 1) * (MOD - 1);
const int M = 2, N = 2e5 + 9;
using matrix = array<array<ll, M>, M>;
matrix operator*(const matrix &a, const matrix &b) {
matrix res{};
for (int i = 0; i < M; ++i) {
ll row[M] = {};
for (int j = 0; j < M; ++j) {
ll r = a[i][j];
if (!r) continue;
for (int k = 0; k < M; ++k) {
row[k] += r * b[j][k];
if (row[k] > LIMIT || row[k] < -LIMIT) {
row[k] %= MOD;
}
}
}
for (int k = 0; k < M; ++k) {
row[k] %= MOD;
if (row[k] < 0) row[k] += MOD;
res[i][k] = row[k];
}
}
return res;
}
matrix Identity(int n) {
matrix ret = {};
for (int i = 0; i < n; ++i)
ret[i][i] = 1;
return ret;
}
matrix mat_power(matrix x, ll p) {
matrix res = Identity(x.size());
while (p) {
if (p & 1) res = (res * x);
x = (x * x);
p >>= 1;
}
return res;
}
matrix f(char c) {
switch (c) {
case '*': return {
{
{0, 0},
{1, 0}
}
};
case 'S': return {
{
{1, 1},
{0, 0}
}
};
case 'D': return {
{
{1, 1},
{0, 0}
}
};
case 'H': return {
{
{0, 0},
{1, 1}
}
};
case 'A': return {
{
{0, 1},
{1, 0}
}
};
case 'E': return {
{
{0, 1},
{1, 0}
}
};
case 'I': return {
{
{0, 1},
{1, 0}
}
};
case 'O': return {
{
{0, 1},
{1, 0}
}
};
case 'U': return {
{
{0, 1},
{1, 0}
}
};
case '?': return {
{
{20, 7},
{6, 19}
}
};
default: return {
{
{1, 0},
{0, 1}
}
};
}
}
matrix tr[N << 2];
void upd(int i, int l, int r, int idx, char c) {
if (l == r) {
tr[i] = f(c);
return;
}
int m = l + r >> 1;
if (idx <= m) {
upd(i << 1, l, m, idx, c);
} else upd(i << 1 | 1, m + 1, r, idx, c);
tr[i] = tr[i << 1] * tr[i << 1 | 1];
}
void ama_aan() {
int n, q;
string s;
cin >> n >> q >> s;
upd(1, 0, n, 0, '*');
for (int i = 0; i < n; i++)
upd(1, 0, n, i + 1, s[i]);
cout << tr[1][1][0] << el;
while (q--) {
int i;
char c;
cin >> i >> c;
upd(1, 1, n, i, c);
cout << tr[1][1][0] << el;
}
}
signed main() {
cin.tie(0)->sync_with_stdio(0);
cout << fixed << setprecision(10);
#if Mosaab
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
int t = 1;
// cin >> t;
while (t--) ama_aan();
}
Ly8g2LnZjtis2Y7YqNmL2Kcg2YTYo9mO2YXZktix2ZAg2KfZhNmF2Y/YpNmS2YXZkNmG2ZDYjCDYpdmG2Y7ZkSDYo9mF2ZLYsdmO2YfZjyDZg9mP2YTZjtmR2YfZjyDYrtmO2YrZktix2YwKI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnVzaW5nIGxsID0gbG9uZyBsb25nOwp1c2luZyBsZCA9IGRvdWJsZTsKY29uc3QgY2hhciBlbCA9ICdcbic7Cgpjb25zdCBpbnQgTU9EID0gMWU5ICsgNzsKY29uc3QgbGwgTElNSVQgPSBMTE9OR19NQVggLSAxbGwgKiAoTU9EIC0gMSkgKiAoTU9EIC0gMSk7CmNvbnN0IGludCBNID0gMiwgTiA9IDJlNSArIDk7Cgp1c2luZyBtYXRyaXggPSBhcnJheTxhcnJheTxsbCwgTT4sIE0+OwoKbWF0cml4IG9wZXJhdG9yKihjb25zdCBtYXRyaXggJmEsIGNvbnN0IG1hdHJpeCAmYikgewoJbWF0cml4IHJlc3t9OwoJZm9yIChpbnQgaSA9IDA7IGkgPCBNOyArK2kpIHsKCQlsbCByb3dbTV0gPSB7fTsKCQlmb3IgKGludCBqID0gMDsgaiA8IE07ICsraikgewoJCQlsbCByID0gYVtpXVtqXTsKCQkJaWYgKCFyKSBjb250aW51ZTsKCQkJZm9yIChpbnQgayA9IDA7IGsgPCBNOyArK2spIHsKCQkJCXJvd1trXSArPSByICogYltqXVtrXTsKCQkJCWlmIChyb3dba10gPiBMSU1JVCB8fCByb3dba10gPCAtTElNSVQpIHsKCQkJCQlyb3dba10gJT0gTU9EOwoJCQkJfQoJCQl9CgkJfQoJCWZvciAoaW50IGsgPSAwOyBrIDwgTTsgKytrKSB7CgkJCXJvd1trXSAlPSBNT0Q7CgkJCWlmIChyb3dba10gPCAwKSByb3dba10gKz0gTU9EOwoJCQlyZXNbaV1ba10gPSByb3dba107CgkJfQoJfQoJcmV0dXJuIHJlczsKfQoKbWF0cml4IElkZW50aXR5KGludCBuKSB7CgltYXRyaXggcmV0ID0ge307Cglmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkKCQlyZXRbaV1baV0gPSAxOwoJcmV0dXJuIHJldDsKfQoKbWF0cml4IG1hdF9wb3dlcihtYXRyaXggeCwgbGwgcCkgewoJbWF0cml4IHJlcyA9IElkZW50aXR5KHguc2l6ZSgpKTsKCXdoaWxlIChwKSB7CgkJaWYgKHAgJiAxKSByZXMgPSAocmVzICogeCk7CgkJeCA9ICh4ICogeCk7CgkJcCA+Pj0gMTsKCX0KCXJldHVybiByZXM7Cn0KCm1hdHJpeCBmKGNoYXIgYykgewoJc3dpdGNoIChjKSB7CgkJY2FzZSAnKic6IHJldHVybiB7CgkJCQl7CgkJCQkJezAsIDB9LAoJCQkJCXsxLCAwfQoJCQkJfQoJCQl9OwoJCWNhc2UgJ1MnOiByZXR1cm4gewoJCQkJewoJCQkJCXsxLCAxfSwKCQkJCQl7MCwgMH0KCQkJCX0KCQkJfTsKCQljYXNlICdEJzogcmV0dXJuIHsKCQkJCXsKCQkJCQl7MSwgMX0sCgkJCQkJezAsIDB9CgkJCQl9CgkJCX07CgkJY2FzZSAnSCc6IHJldHVybiB7CgkJCQl7CgkJCQkJezAsIDB9LAoJCQkJCXsxLCAxfQoJCQkJfQoJCQl9OwoJCWNhc2UgJ0EnOiByZXR1cm4gewoJCQkJewoJCQkJCXswLCAxfSwKCQkJCQl7MSwgMH0KCQkJCX0KCQkJfTsKCQljYXNlICdFJzogcmV0dXJuIHsKCQkJCXsKCQkJCQl7MCwgMX0sCgkJCQkJezEsIDB9CgkJCQl9CgkJCX07CgkJY2FzZSAnSSc6IHJldHVybiB7CgkJCQl7CgkJCQkJezAsIDF9LAoJCQkJCXsxLCAwfQoJCQkJfQoJCQl9OwoJCWNhc2UgJ08nOiByZXR1cm4gewoJCQkJewoJCQkJCXswLCAxfSwKCQkJCQl7MSwgMH0KCQkJCX0KCQkJfTsKCQljYXNlICdVJzogcmV0dXJuIHsKCQkJCXsKCQkJCQl7MCwgMX0sCgkJCQkJezEsIDB9CgkJCQl9CgkJCX07CgkJY2FzZSAnPyc6IHJldHVybiB7CgkJCQl7CgkJCQkJezIwLCA3fSwKCQkJCQl7NiwgMTl9CgkJCQl9CgkJCX07CgkJZGVmYXVsdDogcmV0dXJuIHsKCQkJCXsKCQkJCQl7MSwgMH0sCgkJCQkJezAsIDF9CgkJCQl9CgkJCX07Cgl9Cn0KCm1hdHJpeCB0cltOIDw8IDJdOwoKdm9pZCB1cGQoaW50IGksIGludCBsLCBpbnQgciwgaW50IGlkeCwgY2hhciBjKSB7CglpZiAobCA9PSByKSB7CgkJdHJbaV0gPSBmKGMpOwoJCXJldHVybjsKCX0KCWludCBtID0gbCArIHIgPj4gMTsKCWlmIChpZHggPD0gbSkgewoJCXVwZChpIDw8IDEsIGwsIG0sIGlkeCwgYyk7Cgl9IGVsc2UgdXBkKGkgPDwgMSB8IDEsIG0gKyAxLCByLCBpZHgsIGMpOwoJdHJbaV0gPSB0cltpIDw8IDFdICogdHJbaSA8PCAxIHwgMV07Cn0KCnZvaWQgYW1hX2FhbigpIHsKCWludCBuLCBxOwoJc3RyaW5nIHM7CgljaW4gPj4gbiA+PiBxID4+IHM7Cgl1cGQoMSwgMCwgbiwgMCwgJyonKTsKCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQoJCXVwZCgxLCAwLCBuLCBpICsgMSwgc1tpXSk7Cgljb3V0IDw8IHRyWzFdWzFdWzBdIDw8IGVsOwoJd2hpbGUgKHEtLSkgewoJCWludCBpOwoJCWNoYXIgYzsKCQljaW4gPj4gaSA+PiBjOwoJCXVwZCgxLCAxLCBuLCBpLCBjKTsKCQljb3V0IDw8IHRyWzFdWzFdWzBdIDw8IGVsOwoJfQp9CgpzaWduZWQgbWFpbigpIHsKCWNpbi50aWUoMCktPnN5bmNfd2l0aF9zdGRpbygwKTsKCWNvdXQgPDwgZml4ZWQgPDwgc2V0cHJlY2lzaW9uKDEwKTsKI2lmIE1vc2FhYgoJZnJlb3BlbigiaW5wdXQudHh0IiwgInIiLCBzdGRpbik7CglmcmVvcGVuKCJvdXRwdXQudHh0IiwgInciLCBzdGRvdXQpOwojZW5kaWYKCWludCB0ID0gMTsKCS8vIGNpbiA+PiB0OwoJd2hpbGUgKHQtLSkgYW1hX2FhbigpOwp9Cgo=