#include "bits/stdc++.h" using namespace std; #define FOR(i,j,k) for(int (i)=(j);(i)<(int)(k);++(i)) #define rep(i,j) FOR(i,0,j) #define each(x,y) for(auto &(x):(y)) #define mp make_pair #define mt make_tuple #define all(x) (x).begin(),(x).end() #define debug(x) cout<<#x<<": "<<(x)< pii; typedef vector vi; typedef vector vll; template class SparseTableRMQ { public: SparseTableRMQ() { } SparseTableRMQ(vector &ar) : n((int)ar.size()), data(n) { for (int i = 0; i < n; ++i) data[i] = ar[i]; table = buildRMQ(); } int queryPos(int l, int r) { int k = lgInt(r - l - 1); int lid = table[l + n*k], rid = table[r + n*k - (1 << k)]; return (cmp(data[lid], data[rid])) ? lid : rid; } int queryValue(int l, int r) { return data[queryPos(l, r)]; } private: int n; vector data, table; Cmp cmp; int lgInt(int v) { static const unsigned b[] = { 0x2, 0xC, 0xF0, 0xFF00, 0xFFFF0000 }; static const unsigned S[] = { 1, 2, 4, 8, 16 }; int res = 0; for (int i = 4; i >= 0; i--) { if (v & b[i]) { v >>= S[i]; res |= S[i]; } } return res; } vector buildRMQ() { int logn = 1; for (int k = 1; k < n; k *= 2) ++logn; vector b(n*logn); for (int i = 0; i < n; ++i)b[i] = i; int cur = 0; for (int k = 1; k < n; k *= 2) { copy(b.begin() + cur, b.begin() + cur + n, b.begin() + cur + n); cur += n; for (int i = 0; i < n - k; ++i) { int idl = b[cur + i], idr = b[cur + i + k]; if (cmp(data[idl], data[idr])) { b[cur + i] = idl; } else { b[cur + i] = idr; } } } return b; } }; typedef SparseTableRMQ> RMinQ; typedef SparseTableRMQ> RMaxQ; int main(){ ios::sync_with_stdio(false); cin.tie(0); int N; cin >> N; vector> S(N); rep(i, N) { cin >> S[i].first; S[i].second = i; } sort(all(S)); vi id(N), lcp(N - 1); rep(i, N)id[S[i].second] = i; rep(i, N - 1) { string &s = S[i].first, &t = S[i + 1].first; rep(j, min(sz(s), sz(t))) { if (s[j] != t[j])break; lcp[i] = j + 1; } } RMinQ rmq(lcp); ll M, x, d, ans = 0; cin >> M >> x >> d; while (M--) { ll l = (x / (N - 1)) + 1, r = (x % (N - 1)) + 1; if (l > r)swap(l, r); else r++; x = (x + d) % (N*(N - 1)); int lb = min(id[--l], id[--r]), ub = id[l] ^ id[r] ^ lb; ans += rmq.queryValue(lb, ub); } cout << ans << endl; }