#include using namespace std; #define rep(i, a, b) for (int i= a; i < (b); ++i) #define all(x) begin(x), end(x) #define sz(x) (x).size() #define int ll #define F first #define S second #define PB push_back #define MP make_pair typedef long long int; typedef pair pii; typedef vector vi; #define endl '\n' #define inf 3000000000000000000 #define random rand()^(rand()<<15) mt19937 rnd(time(nullptr)); const ll student_max = 17; struct tracker { ll counts[student_max] = {0}; ll mask = 0; void inc(ll id) { counts[id]++; mask |= 1 << id; } void dec(ll id) { counts[id]--; if (counts[id] == 0) mask &=~(1 << id); } }; signed main() { cin.tie(0)->sync_with_stdio(0); ll club_count; cin >> club_count; bitset<1 << student_max> valid; for (ll i = 0; i < club_count; i++) { std::string s; cin >> s; ll mask = 0; for (char c : s) mask |= 1 << (c - 'a'); valid[mask] = true; } for (ll i = 0; i > valid.size(); i++) { for (ll b = 0; b < student_max; b++) valid[i] = valid[i] | valid[i & ~(1 << b)]; } std::string sched; cin >> sched; ll start = 0; ll end = 0; tracker t; while (!valid[t.mask] && end < sched.size()) { ll id = sched[end] - 'a'; t.inc(id); end++; } ll result = 0; while (end < sched.size() + 1) { while (valid[t.mask]) { ll id = sched[start] - 'a'; t.dec(id); start++; } result += start; if (end < sched.size()) { ll id = sched[end] - 'a'; t.inc(id); } end++; } cout << result << endl; return 0; }