#include <bits/stdc++.h>
using namespace std;
const int MOD = 998244353;
inline int addmod(int a, int b) {
int res = a + b;
if (res >= MOD) res -= MOD;
return res;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N;
string T;
cin >> N >> T;
int total = 1 << N;
vector<int> dp(total, 0);
dp[0] = 1;
// 각 알파벳마다 등장 인덱스를 저장
vector<vector<int>> pos(26);
for (int i = 0; i < N; i++) {
pos[T[i] - 'a'].push_back(i);
}
for (int mask = 0; mask < total; mask++) {
if (!dp[mask]) continue;
int len = __builtin_popcount(mask);
// 새로운 문자 하나 선택
for (int j = 0; j < N; j++) {
if (mask & (1 << j)) continue; // 이미 선택된 문자 skip
// 같은 문자 오름차순 제약
bool ok = true;
for (int prev : pos[T[j] - 'a']) {
if (prev < j && !(mask & (1 << prev))) {
ok = false; // 이전 동일 문자가 아직 추가 안됨
break;
}
}
if (!ok) continue;
int newMask = mask | (1 << j);
dp[newMask] = addmod(dp[newMask], (int)((1LL * dp[mask] * (len + 1)) % MOD));
}
}
cout << dp[total - 1] << "\n";
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmNvbnN0IGludCBNT0QgPSA5OTgyNDQzNTM7CgppbmxpbmUgaW50IGFkZG1vZChpbnQgYSwgaW50IGIpIHsKICAgIGludCByZXMgPSBhICsgYjsKICAgIGlmIChyZXMgPj0gTU9EKSByZXMgLT0gTU9EOwogICAgcmV0dXJuIHJlczsKfQoKaW50IG1haW4oKSB7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwoKICAgIGludCBOOwogICAgc3RyaW5nIFQ7CiAgICBjaW4gPj4gTiA+PiBUOwoKICAgIGludCB0b3RhbCA9IDEgPDwgTjsKICAgIHZlY3RvcjxpbnQ+IGRwKHRvdGFsLCAwKTsKICAgIGRwWzBdID0gMTsKCiAgICAvLyDqsIEg7JWM7YyM67Kz66eI64ukIOuTseyepSDsnbjrjbHsiqTrpbwg7KCA7J6lCiAgICB2ZWN0b3I8dmVjdG9yPGludD4+IHBvcygyNik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgewogICAgICAgIHBvc1tUW2ldIC0gJ2EnXS5wdXNoX2JhY2soaSk7CiAgICB9CgogICAgZm9yIChpbnQgbWFzayA9IDA7IG1hc2sgPCB0b3RhbDsgbWFzaysrKSB7CiAgICAgICAgaWYgKCFkcFttYXNrXSkgY29udGludWU7CiAgICAgICAgaW50IGxlbiA9IF9fYnVpbHRpbl9wb3Bjb3VudChtYXNrKTsKCiAgICAgICAgLy8g7IOI66Gc7Jq0IOusuOyekCDtlZjrgpgg7ISg7YOdCiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBOOyBqKyspIHsKICAgICAgICAgICAgaWYgKG1hc2sgJiAoMSA8PCBqKSkgY29udGludWU7IC8vIOydtOuvuCDshKDtg53rkJwg66y47J6QIHNraXAKCiAgICAgICAgICAgIC8vIOqwmeydgCDrrLjsnpAg7Jik66aE7LCo7IicIOygnOyVvQogICAgICAgICAgICBib29sIG9rID0gdHJ1ZTsKICAgICAgICAgICAgZm9yIChpbnQgcHJldiA6IHBvc1tUW2pdIC0gJ2EnXSkgewogICAgICAgICAgICAgICAgaWYgKHByZXYgPCBqICYmICEobWFzayAmICgxIDw8IHByZXYpKSkgewogICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7IC8vIOydtOyghCDrj5nsnbwg66y47J6Q6rCAIOyVhOyngSDstpTqsIAg7JWI65CoCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFvaykgY29udGludWU7CgogICAgICAgICAgICBpbnQgbmV3TWFzayA9IG1hc2sgfCAoMSA8PCBqKTsKICAgICAgICAgICAgZHBbbmV3TWFza10gPSBhZGRtb2QoZHBbbmV3TWFza10sIChpbnQpKCgxTEwgKiBkcFttYXNrXSAqIChsZW4gKyAxKSkgJSBNT0QpKTsKICAgICAgICB9CiAgICB9CgogICAgY291dCA8PCBkcFt0b3RhbCAtIDFdIDw8ICJcbiI7CiAgICByZXR1cm4gMDsKfQ==