#include using namespace std; const int MAXN = 1e4 + 10; int n; string p[MAXN], s; int cl[26], cr[26], kl[MAXN], kr[MAXN]; int nxt[MAXN * 200][26]; int cost[MAXN * 200]; int lst = 3, lft = 1, rht = 2; void add(int s, string &t, int cst) { int v = s; for(auto c : t) { if(!nxt[v][c - 'a']) { nxt[v][c - 'a'] = lst++; } v = nxt[v][c - 'a']; } if(cost[v] == 0) { cost[v] = cst; } else { cost[v] = min(cost[v], cst); } } long long dp[1001][1001]; int32_t main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n; for(int i = 0; i < n; i++) { cin >> p[i]; } for(int i = 0; i < 26; i++) { cin >> cl[i]; } for(int i = 0; i < 26; i++) { cin >> cr[i]; } for(int i = 0; i < n; i++) { cin >> kl[i]; } for(int i = 0; i < n; i++) { cin >> kr[i]; } for(int i = 0; i < n; i++) { add(lft, p[i], kl[i]); reverse(p[i].begin(), p[i].end()); add(rht, p[i], kr[i]); } cin >> s; for(int i = 0; i < s.size(); i++) { dp[i][i] = 0; } for(int len = 2; len <= s.size(); len++) { for(int l = 0; l + len - 1 < s.size(); l++) { int r = l + len - 1; dp[l][r] = min(dp[l + 1][r] + 1ll * cl[s[l] - 'a'] * (r - l), dp[l][r - 1] + 1ll * cr[s[r] - 'a'] * (r - l)); for(int i = l, v = lft; i <= min(r, l + 99); i++) { if(nxt[v][s[i] - 'a'] == 0) { break; } v = nxt[v][s[i] - 'a']; if(cost[v] != 0) { dp[l][r] = min(dp[l][r], (i == r ? 0ll : dp[i + 1][r] + 1ll * cost[v] * (r - i))); } } for(int i = r, v = rht; i >= max(l, r - 99); i--) { if(nxt[v][s[i] - 'a'] == 0) { break; } v = nxt[v][s[i] - 'a']; if(cost[v] != 0) { dp[l][r] = min(dp[l][r], (i == l ? 0ll : dp[l][i - 1] + 1ll * cost[v] * (i - l))); } } } } cout << dp[0][s.size() - 1]; }