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