#include using namespace std; const int bitsN = 18; vector contains(1 << bitsN); void Initialize() { for (int i = 0; i < (int)contains.size(); ++i) for (int j = 0; j < bitsN; ++j) if ((1 << j) & i) contains[i] |= contains[i & ~(1 << j)]; } void AddToSet(int mask) { contains[mask] = true; } bool HaveSubMask(int main_mask) { return contains[main_mask]; } int N; int CUR_INPUT_MASK = 0; int TOTAL_MASK = 0; int CNT_BIT[30]; int main() { cin >> N; for (int i = 0; i < N; i++) { string ST; cin >> ST; CUR_INPUT_MASK = 0; for (char c : ST) { CUR_INPUT_MASK |= (1 << ((int)(c - 'a'))); } AddToSet(CUR_INPUT_MASK); } Initialize(); string st; cin >> st; int l = 0, r = -1; int ans = 0; while (true) { if (r + 1 >= (int)st.size())break; r++; int R_id = ((int)(st[r] - 'a')); CNT_BIT[R_id]++; TOTAL_MASK |= (1 << R_id); while (HaveSubMask(TOTAL_MASK)) { ans += ((int)st.size() - r); int L_id = ((int)(st[l] - 'a')); if (CNT_BIT[L_id] == 1) TOTAL_MASK ^= (1 << L_id); CNT_BIT[L_id]--; l++; } } cout << ans << '\n'; return 0; }