// {{{ Templates #include #define show(x) cerr << #x << " = " << x << endl using namespace std; using ll = long long; using pii = pair; using vi = vector; template ostream& operator<<(ostream& os, const vector& v) { os << "sz:" << v.size() << "\n["; for (const auto& p : v) { os << p << ","; } os << "]\n"; return os; } template ostream& operator<<(ostream& os, const pair& p) { os << "(" << p.first << "," << p.second << ")"; return os; } constexpr ll MOD = (ll)1e9 + 7LL; template constexpr T INF = numeric_limits::max() / 100; // }}} struct Min { using T = int; T operator()(const T& a, const T& b) const { return min(a, b); } }; template class SparseTable { public: using T = typename Base::T; using SemiLattice = Base; SparseTable(const vector& val) : size(val.size()), lg2(size + 1, 0) { for (int i = 2; i <= size; i++) { lg2[i] = lg2[i / 2] + 1; } table.resize(size, vector(lg2[size] + 1)); for (int i = 0; i < size; i++) { table[i][0] = val[i]; } for (int j = 0; j < lg2[size]; j++) { const int w = 1 << j; for (int i = 0; i <= size - (w << 1); i++) { T tl = table[i][j], tr = table[i + w][j]; table[i][j + 1] = op(tl, tr); } } } T accumulate(const int l, const int r) const { assert(0 <= l and l < r and r <= size); const int j = lg2[r - l]; return op(table[l][j], table[r - (1 << j)][j]); } private: const int size; vector lg2; vector> table; const SemiLattice op{}; }; inline int common(const string& s1, const string& s2) { int c = 0; for (int i = 0; i < min(s1.size(), s2.size()); i++) { if (s1[i] != s2[i]) { break; } c++; } return c; } int main() { cin.tie(0); ios::sync_with_stdio(false); ll N; cin >> N; vector> S(N); for (int i = 0; i < N; i++) { cin >> S[i].first; S[i].second = i; } sort(S.begin(), S.end()); vector convert(N, 0); for (int i = 0; i < N; i++) { convert[S[i].second] = i; } vector lcp(N - 1, 0); for (int i = 0; i < N - 1; i++) { lcp[i] = common(S[i].first, S[i + 1].first); } SparseTable table{lcp}; int M; cin >> M; ll x, d; cin >> x >> d; ll sum = 0; for (int q = 0; q < M; q++) { ll i = x / (N - 1) + 1; ll j = x % (N - 1) + 1; if (i > j) { swap(i, j); } else { j++; } i--; j--; int ind1 = convert[i]; int ind2 = convert[j]; if (ind1 > ind2) { swap(ind1, ind2); } sum += table.accumulate(ind1, ind2); x = (x + d) % (N * (N - 1)); } cout << sum << endl; return 0; }