题目大意就是给你一个长度为n个字符串,然后有q次询问,每次询问给个m和ch,问最多修改m个字符的值,可以得到的最长的连续ch字符的长度是多少?
用的是尺取法,尺取和二分都一样都需要问题具有单调性,也就是要明白什么时候low,up移动。这里介绍一下尺取法
1.概念:不断推进区间的开头和结尾,求满足条件的最小(长)区间的方法称为尺取法。所谓尺取法,顾名思义,就是像一把尺子(固定某一条件),不断向右(左)移动,不断更新所求答案。一般用来求满足条件的最小区间。
2.实现步骤:
- 初始化左右端点
- 不断扩大右端点,直至满足条件
- 如果直至终点也无法满足条件,则终止,否则更新结果
- 扩大左端点(右移1),跳回步骤2
在这题这个尺子也就是条件就是修改字符的个数<=m,1.一但不满足条件了就扩大左端点直至满足条件,2.要是满足条件的话就扩大右端点,然后更新res。尺取的终点就是右端点到了字符串尾。
#include<bits/stdc++.h>
using namespace std;
int main()
{
char s[1505];
int n,q,res;
cin>>n>>s+1>>q;
while(q--)
{
int m,len,res,low=1;
char ch;
len=0;
res=-1;
cin>>m>>ch;
for(int up=1;up<=n;up++)
{
if(s[up]!=ch) len++;
while(len>m)
{
if(s[low]!=ch) len--;
low++;
}
res=max(res,up-low+1);//左端点往扩大后,肯定不会是答案,但是此时更新res也没问题,答案产生于右端点右移的时候
}
cout<<res<<endl;
}
return 0;
}