#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define loop(i,a,b) for(int i=a;i pii; typedef vector vi; typedef vector vvi; typedef vector vp; typedef vector vvp; typedef vector vs; typedef vector vd; typedef tuple tp; typedef vector vt; typedef vector vvd; typedef pair pip; typedef vectorvip; const double PI=acos(-1); const double EPS=1e-7; const int inf=1e9; const ll INF=2e18; int dx[]={0,1,0,-1}; int dy[]={1,0,-1,0}; //http://tookunn.hatenablog.com/entry/2016/07/13/211148 // //make:O(NlogN) update:muri query:O(1) // typedef int SegT; const int defvalue=0; class ST{//Sparse_table public: vector A,log_table; vector >table; int n; SegT combine(SegT a,SegT b){return min(a,b);} ST(const vector &in){ n=in.size(); A=in; log_table=vector(n+1); loop(i,2,n+1)log_table[i]=log_table[i>>1]+1; table=vector >(n,vector(log_table[n]+1)); rep(i,n)table[i][0]=i; for(int k=1;(1<t)assert(1); int d=t-s+1; int k=log_table[d]; int out; if(A[table[s][k]]>n; vp in(n); rep(i,n)cin>>in[i].first; rep(i,n)in[i].second=i; sort(all(in)); vi lcp(n-1); rep(i,n-1){ int co=0; rep(j,min(in[i].first.size(),in[i+1].first.size()))if(in[i].first[j]==in[i+1].first[j])co++;else break; lcp[i]=co; } ST st(lcp); ll m,x,d; cin>>m>>x>>d; vi to(n); rep(i,n)to[in[i].second]=i; ll out=0; while(m--){ int i=x/(n-1); int j=x%(n-1); if(i>j)swap(i,j); else j++; i=to[i];j=to[j]; if(i>j)swap(i,j); x=(x+d)%(n*(n-1)); out+=st.query(i,j-1); } cout<