先考虑最暴力的情况,左边界确定,只要找到一个右边界,那么这个右边界右边的所有选择都是合法的。
每次确定一个左边界,独立找出去,一定TLE。
但我们发现当《当每次枚举的左边界向右移动的时候,和前一次右边界相比,右边界显然不会向左移动》,所以用双指针法
nt f[1000010],g[1000010],n,a,b;
void solve()
{
cin>>n>>a>>b;
string s; cin>>s;
s=" "+s; //字符串下标就可以从1开始啦
for(int i=1;i<=n;i++)
{
f[i]=f[i-1],g[i]=g[i-1];
if(s[i]=='0') f[i]++;//记录枚举到第i个字符时,0的个数
else g[i]++;//记录枚举到第i个字符时,1的个数
//f[] g[]是排好升序的 ?
}
int ans=0;
for(int i=1;i<=n;i++)
{//每次i是《固定》的左边界
int l = i,r = n;//双指针法l,r
while(l<r)//双指针移动
{
int mid=(l+r)>>1;//二分法
if( f[mid]-f[i-1] >=a && g[mid]-g[i-1]>=b) //r向前走,不断缩小左右指针的距离