#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define f first #define s second #define ll long long #define ull unsigned long long #define mp make_pair #define pb push_back #define vi vector #define ld long double #define pii pair #define y1 sda using namespace std; const int N = int(1e6) + 10, mod = int(1e9) + 7, block = 350, base = 2011; int n,m, h[N], len[N]; char s[N]; ull a[N],b[N], p[N]; int c[N], cn; pair q[N]; unordered_map ma[N]; ll ans[N]; string t[N]; bool cmp(pair a,pair b){ if(a.s.f / block != b.s.f / block) return a.s.f < b.s.f; return a.s.s > b.s.s; } void add(int x){ ma[len[x]][a[x]] += h[x]; } void del(int x){ ma[len[x]][a[x]] -= h[x]; } ull hsh(int l,int r){ return b[r] - b[l - 1] * p[r - l + 1]; } ll get(int id){ ll res = 0; p[0] = 1; for(int i = 1; i < t[id].size(); i++){ b[i] = b[i - 1] * base + t[id][i]; p[i] = p[i - 1] * base; } for(int i = 1; i <= cn; i++){ for(int j = 1; j + c[i] - 1 < t[id].size(); j++){ ull h = hsh(j,j + c[i] - 1); if(ma[c[i]].count(h)) res += ma[c[i]][h]; } } return res; } int main () { scanf("%d\n",&n); for(int i = 1; i <= n; i++){ scanf("%s ",s + 1); len[i] = strlen(s + 1); c[++cn] = len[i]; a[i] = 0; for(int j = 1; j <= len[i]; j++) a[i] = a[i] * base + s[j]; } sort(c + 1, c + cn + 1); cn = unique(c + 1, c + cn + 1) - c - 1; for(int i = 1; i <= n; i++) scanf("%d",&h[i]); scanf("%d\n",&m); for(int i = 1;i <= m;i++){ scanf("%d%d ",&q[i].s.f,&q[i].s.s); scanf("%s ",s + 1); q[i].s.f++; q[i].s.s++; int len = strlen(s + 1); t[i] = "x"; for(int j = 1; j <= len; j++) { t[i] += s[j]; } q[i].f = i; } sort(q + 1, q + m + 1,cmp); int l = q[1].s.f,r = q[1].s.s; for(int i = l; i <= r;i++){ add(i); } ans[q[1].f] = get(q[1].f); int lx,rx; for(int i = 2; i <= m; i++){ lx = q[i].s.f; rx = q[i].s.s; while(r < rx){ r++; add(r); } while(r > rx){ del(r); r--; } while(l > lx){ l--; add(l); } while(l < lx){ del(l); l++; } ans[q[i].f] = get(q[i].f); } ll mx = 0, mn = (1ll<<50); for(int i = 1; i <= m; i++){ mx = max(mx, ans[i]); mn = min(mn, ans[i]); } printf("%lld %lld" ,mn, mx); return 0; }