#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int MOD = 998244353;
void add(int& a, int b) {
a += b;
if (a >= MOD) a -= MOD;
if (a < 0) a += MOD;
}
int n;
string s[23];
int cnt[23][26];
int sum_idx[1 << 23];
int min_cnt[1 << 23][26];
int sos[1 << 23];
int sign(int mask) {
return (__builtin_parity(mask) ? 1 : -1);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for (int i = 0; i < n; i++) cin >> s[i];
for (int i = 0; i < n; i++) {
for (char c : s[i]) ++cnt[i][c - 'a'];
}
sum_idx[0] = 0;
for (int c = 0; c <= 25; c++) min_cnt[0][c] = INF;
for (int mask = 1; mask < (1 << n); mask++) {
int i = __builtin_ctz(mask);
sum_idx[mask] = sum_idx[mask ^ (1 << i)] + (i + 1);
for (int c = 0; c <= 25; c++) {
min_cnt[mask][c] = min(min_cnt[mask ^ (1 << i)][c], cnt[i][c]);
}
}
for (int mask = 1; mask < (1 << n); mask++) {
sos[mask] = 1;
for (int c = 0; c <= 25; c++) {
sos[mask] = 1ll * sos[mask] * (min_cnt[mask][c] + 1) % MOD;
}
}
for (int mask = 0; mask < (1 << n); mask++) {
sos[mask] = sign(mask) * sos[mask];
}
for (int i = 0; i < n; i++) {
for (int mask = 0; mask < (1 << n); mask++) {
if (mask & (1 << i)) add(sos[mask], sos[mask ^ (1 << i)]);
}
}
ll ans = 0;
for (int mask = 0; mask < (1 << n); mask++) {
if (sos[mask] < 0) sos[mask] += MOD;
int k = __builtin_popcount(mask);
ans ^= 1ll * sos[mask] * k * sum_idx[mask];
}
cout << ans << '\n';
}