#include using namespace std; using ll = long long; using vll = vector; using pll = pair; #define sz(x) ((ll)(x).size()) #define For(i, a, n) for(ll i = a; i < (ll)(n); i++) const ll MOD = 1e9+7; template ostream& operator<<(ostream &os, const vector &cont) { for (auto it = cont.begin(); it != cont.end(); ++it) os << (it == cont.begin() ? "" : " ") << *it; return os; } template ostream& operator<<(ostream &os, const vector> &cont) { for (auto it = cont.begin(); it != cont.end(); ++it) os << (it == cont.begin() ? "" : "\n") << *it; return os; } template ostream& operator<<(ostream &os, const pair &cont) { os << "(" << cont.first << ", " << cont.second << ")"; return os; } // TODO fill F[11111...] ll ABC=17; ll INF=1000000000; vector>> F; pair> f(ll mask) { if (F[mask].first != -1) return F[mask]; pair> best={INF, {-1, -1}}; For(i, 0, ABC) { ll mask2 = mask | (1 << i); if (mask == mask2) continue; auto r = f(mask2); best = min(best, r); } return F[mask] = best; } ll to_set(vector> &prefixy, ll lo, ll hi) { vll p_lo = prefixy[lo]; vll p_hi = prefixy[hi+1]; ll res = 0; For(c, 0, ABC) res |= (p_hi[c] > p_lo[c]) << c; return res; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); ll QN; cin >> QN; vll search_clubs(QN); For(i, 0, QN) { string s; cin >> s; ll b = 0; for (char c: s) { ll x = c - 'a'; ll e = 1 << x; if (!(b & e)) b |= e; } search_clubs[i] = b; } string S; cin >> S; ll N = sz(S); vector> prefixy(sz(S)+1, vector(ABC, 0)); For(i, 0, N) { ll x = S[i] - 'a'; prefixy[i+1] = prefixy[i]; prefixy[i+1][x]++; } vector last(ABC, -1); vector> nearest(N, vector(ABC, -1)); for (ll i = N - 1; i >= 0; --i) { ll x = S[i] - 'a'; last[x] = i; nearest[i] = last; } F.resize(1 << 17, {-1, {-1, -1}}); For(start, 0, N) { For(endc, 0, ABC) { ll end = nearest[start][endc]; if (end == -1) continue; ll mask = to_set(prefixy, start, end); ll range_size = end - start + 1; if (F[mask].first == -1) F[mask].first= INF; F[mask] = min(F[mask], {range_size, {start, end}}); bitset<17> maskb(mask); } } For(i, 0, 1 << 17) f(i); ll res = INF; For(i, 0, QN) { ll mask = search_clubs[i]; bitset<17> maskb(mask); auto resf = f(mask); res = min(res, resf.first); } cout << res << "\n"; }