这题傻了,用dp写了俩多小时没写出来。。。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define int long long
const int N = 1000010,INF=0x3f3f3f3f;
char s[N];
int n,k,w,q;
signed main()
{
scanf("%lld",&n);
scanf("%s",s+1);
scanf("%lld%lld%lld",&k,&w,&q);
int d[N],idx=0;
d[0]=-INF;
for(int i=1;i<=n;i++)if(s[i]=='0')d[++idx]=i;
int res=0;
for(int i=2;i<idx;i++)
{
int x=d[i]-k,y=d[i]+k;
int pos1=lower_bound(d+1,d+idx+1,x)-d;
int pos2=lower_bound(d+1,d+idx+1,y)-d;
int d1=min(abs(x-d[pos1]),abs(x-d[pos1-1]));
int d2=min(abs(y-d[pos2]),abs(y-d[pos2-1]));
res=max(res,max(0ll,w-d1*q)+max(0ll,w-d2*q));
}
cout<<res<<endl;
}