#include #include #include #include #define limit 524288 #define maxlog 20 #define mod 998244353 #define maxn 100000 namespace cltstream { #define size 1048576 char cltin[size + 1], *ih = cltin, *it = cltin; inline char gc() { #ifdef ONLINE_JUDGE if (ih == it) { it = (ih = cltin) + fread(cltin, 1, size, stdin); if (ih == it) return EOF; } return *ih++; #else return getchar(); #endif } char cltout[size + 1], *oh = cltout, *ot = cltout + size; inline void pc(char c) { if (oh == ot) { fwrite(cltout, 1, size, stdout); oh = cltout; } *oh++ = c; } #define clop() fwrite(cltstream::cltout, 1, cltstream::oh - cltstream::cltout, stdout), cltstream::oh = cltstream::cltout #undef size template inline void read(_tp& x) { char c = gc(); for (; c != 45 && (c < 48 || c > 57) && c != EOF; c = gc()); int sgn = c == 45 ? c = gc(), -1 : 1; for (x = 0; c >= 48 && c <= 57 && c != EOF; x = (x << 3) + (x << 1) + (c ^ 48), c = gc()); x *= sgn; } template inline void write(_tp x, char text = -1) { if (x < 0) pc(45), x = -x; if (!x) pc(48); else { int digit[22]; for (digit[0] = 0; x; digit[++digit[0]] = x % 10, x /= 10); for (; digit[0]; pc(digit[digit[0]--] ^ 48)); } if (text >= 0) pc(text); } inline void put(char str[], char text = -1) { for (int cur = 0; str[cur]; pc(str[cur++])); if (text >= 0) pc(text); } } int unit[2][24]; int inv[limit], fac[limit], fav[limit]; int rev[limit]; inline int add(int a, int b) { return a + b < mod ? a + b : a + b - mod; } inline int sub(int a, int b) { return a - b >= 0 ? a - b : a - b + mod; } inline int pow(int a, int n) { int res = 1; for (; n; n >>= 1, a = 1LL * a * a % mod) if (n & 1) res = 1LL * res * a % mod; return res; } inline int C(int n, int m) { if (m >= 0 && m <= n) return 1LL * fac[n] * fav[m] % mod * fav[n - m] % mod; else return 0; } inline void InitIntUnit() { unit[0][23] = pow(3, 119); unit[1][23] = pow(332748118, 119); for(int i = 0; i < 2; ++i) for(int j = 22; j >= 0; --j) unit[i][j] = 1LL * unit[i][j + 1] * unit[i][j + 1] % mod; } inline void InitFac() { inv[1] = 1; for (int i = 2; i < limit; ++i) inv[i] = sub(0, 1LL * (mod / i) * inv[mod % i] % mod); fac[0] = fav[0] = 1; for (int i = 1; i < limit; ++i) { fac[i] = 1LL * fac[i - 1] * i % mod; fav[i] = 1LL * fav[i - 1] * inv[i] % mod; } } inline void Derivative(int F[], int n, int G[]) { for (int i = 0; i < n; ++i) G[i] = 1LL * (i + 1) * F[i + 1] % mod; G[n] = 0; } inline void Integration(int F[], int n, int G[], int C) { for (int i = n + 1; i > 0; --i) G[i] = 1LL * inv[i] * F[i - 1] % mod; G[0] = C; } inline void NTT(int F[], int N, int tp, int A[]) { for (int i = 0; i < N; ++i) A[i] = F[rev[i] = (rev[i >> 1] >> 1) | ((i & 1) ? (N >> 1) : 0)]; for (int k = 1, p = 1; p < N; ++k, p <<= 1) for (int i = 0; i < N; i += p << 1) for (int j = i, tmp = 1; j < i + p; ++j, tmp = 1LL * tmp * unit[tp][k] % mod) { int x = A[j], y = 1LL * A[j + p] * tmp % mod; A[j] = add(x, y); A[j + p] = sub(x, y); } if (tp == 1) { int v = pow(N, mod - 2); for (int i = 0; i < N; ++i) A[i] = 1LL * A[i] * v % mod; } } inline void Prod(int F[], int n, int G[], int m, int H[]) { static int A[limit], B[limit], C[limit]; int N = 1; for (; N < n + m + 1; N <<= 1); for (int i = n + 1; i < N; ++i) F[i] = 0; for (int i = m + 1; i < N; ++i) G[i] = 0; NTT(F, N, 0, A); NTT(G, N, 0, B); for (int i = 0; i < N; ++i) C[i] = 1LL * A[i] * B[i] % mod; NTT(C, N, 1, H); for (int i = n + m + 1; i < N; ++i) H[i] = 0; } inline void Inv(int F[], int n, int G[]) { static int tmp[limit], res[limit]; res[0] = pow(F[0], mod - 2); for (int i = 1; i - 1 < n; i <<= 1) { for (int j = 0; j < 2 * i; ++j) tmp[j] = F[j]; Prod(tmp, 2 * i - 1, res, i - 1, tmp); for (int j = 0; j < 2 * i; ++j) tmp[j] = sub(0, tmp[j]); tmp[0] = add(tmp[0], 2); Prod(tmp, 2 * i - 1, res, i - 1, res); } for (int i = 0; i <= n; ++i) G[i] = res[i]; } int n, m; int a[maxn + 5]; char s[maxn + 5]; int cnt[maxn + 5]; int f[limit], g[limit], h[limit]; int pos[limit], neg[limit], invneg[limit], ans[limit]; void dfs(int arr[], int cur, int l, int r) { if (l < r) { int mid = (l + r) >> 1; dfs(arr, cur << 1, l, mid); dfs(arr, cur << 1 | 1, mid + 1, r); f[0] = 1; for (int i = l; i <= mid; ++i) f[i - l + 1] = arr[i]; g[0] = 1; for (int i = mid + 1; i <= r; ++i) g[i - mid] = arr[i]; Prod(f, mid - l + 1, g, r - mid, h); for (int i = l; i <= r; ++i) arr[i] = h[i - l + 1]; } } int main() { InitIntUnit(); InitFac(); cltstream::read(n); cltstream::read(m); for (int i = 1; i <= n; ++i) cltstream::read(a[i]); for (int i = 1; i <= m; ++i) for (; s[i] != 'a' && s[i] != 's'; s[i] = cltstream::gc()); for (int i = m, j = 0; i >= 0; j += (s[i] == 's'), --i) { ++cnt[j]; --cnt[j + 1]; } int poslen = 0; for (int i = 0; i <= m + 1; ++i) for (int j = 1; j <= cnt[i]; ++j) pos[++poslen] = sub(0, i); dfs(pos, 1, 1, poslen); pos[0] = 1; int neglen = 0; for (int i = 0; i <= m + 1; ++i) for (int j = 1; j <= -cnt[i]; ++j) neg[++neglen] = sub(0, i); dfs(neg, 1, 1, neglen); neg[0] = 1; Inv(neg, n, invneg); Prod(pos, poslen, invneg, n, ans); int sum = 0; for (int i = 1; i <= n; ++i) sum = add(sum, 1LL * ans[i - 1] * ans[n - i] % mod * a[i] % mod); cltstream::write(sum); clop(); return 0; }