#include <bits/stdc++.h>
using namespace std;
const int MOD = 998244353;
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 totalStates = 1 << N;
vector<int> dp(totalStates, 0);
dp[0] = 1; // 초기 상태: 빈 문자열
// 알파벳별로 인덱스 저장
vector<vector<int>> positions(26);
for (int i = 0; i < N; i++) {
positions[T[i] - 'a'].push_back(i);
}
// 비트마스크 DP
for (int mask = 0; mask < totalStates; mask++) {
if (dp[mask] == 0) continue;
int len = __builtin_popcount(mask);
// 다음으로 넣을 문자 결정
for (int i = 0; i < N; i++) {
if (mask & (1 << i)) continue; // 이미 포함된 문자면 skip
// 중복 문자 처리:
// 같은 문자가 여러 개라면, 인덱스가 증가하는 순서로만 넣을 수 있도록
char c = T[i];
bool ok = true;
for (int idx : positions[c - 'a']) {
if (idx < i && !(mask & (1 << idx))) {
ok = false; // 앞의 같은 문자보다 먼저 추가되면 안됨
break;
}
}
if (!ok) continue;
int newMask = mask | (1 << i);
dp[newMask] = addmod(dp[newMask], (int)((1LL * dp[mask] * (len + 1)) % MOD));
}
}
cout << dp[totalStates - 1] << "\n";
return 0;
}