取补比取交要简单….思考问题的另一面;
#include<bits/stdc++.h>
#define rep(i,k,n) for(int i=k;i<=n;i++)
using namespace std;
const int N=1e6+7;
char s[N];
int n,a,b,p,m,len,tot=0;
void upd(int& x,int y){x+=y;if(x>=n)x-=n;while(x<0)x+=n;}
struct E{
int x,y;E(int x=0,int y=0):x(x),y(y){}
}c[N<<2];
bool cmp(const E& A,const E& B){return A.x<B.x;}
int main(){
scanf("%d%d%d%d%d",&n,&a,&b,&p,&m);
scanf("%s",s);len=strlen(s);
int k=0,up,dw,ans=0,r=0;
rep(i,0,len-1){
if(s[i]=='1')dw=-k,up=p-k-1;
else dw=p-k,up=n-k-1;
upd(dw,0),upd(up,0);
if(dw<=up)c[++tot]=E(dw,up);
else {c[++tot]=E(dw,n-1);c[++tot]=E(0,up);}
upd(k,a);
}k=1ll*(n-m+1)*a%n;
rep(i,n-m+2,n){int res=k;upd(res,b);c[++tot]=E(res,res);upd(k,a);}
sort(c+1,c+tot+1,cmp);
rep(i,1,tot){
if(c[i].x>r)
ans+=c[i].x-r;
r=max(r,c[i].y+1);
}
printf("%d\n",ans+n-r);
}