懵逼,原来大暴力是可以过的。
显然访问过的照片都得看。
令x[i]为从1开始向右滑动到i的花费,y[i]为从1开始向左滑动到i的花费。
发现x[]和y[]都是单调的,所以可以Two-Pointers或者二分。
注意最后要和n取min。
/* Footprints In The Blood Soaked Snow */ #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 500005; int n, a, b, T, x[maxn], y[maxn]; char str[maxn]; int main() { scanf("%d%d%d%d%s", &n, &a, &b, &T, str + 1); for(int i = 2; i <= n; i++) x[i] = x[i - 1] + a + 1 + (str[i] == 'w') * b; for(int i = n; i >= 2; i--) y[i] = y[i + 1] + a + 1 + (str[i] == 'w') * b; T -= (str[1] == 'w') * b + 1; int ans = 0; for(int i = 1, j = 2; i <= n; i++) { for(; x[i] + y[j] + (i - 1) * a > T && j <= n + 1; j++); if(x[i] > T) break; ans = max(ans, i + n - j + 1); } for(int i = 1, j = 2; i <= n; i++) { for(; x[i] + y[j] + (n - j + 1) * a > T && j <= n + 1; j++); if(x[i] > T) break; ans = max(ans, i + n - j + 1); } ans = min(ans, n); printf("%d\n", ans); return 0; }