An impassioned circulation of affection CodeForces

  题目大意就是给你一个长度为n个字符串,然后有q次询问,每次询问给个m和ch,问最多修改m个字符的值,可以得到的最长的连续ch字符的长度是多少?

用的是尺取法,尺取和二分都一样都需要问题具有单调性,也就是要明白什么时候low,up移动。这里介绍一下尺取法

1.概念:不断推进区间的开头和结尾,求满足条件的最小(长)区间的方法称为尺取法。所谓尺取法,顾名思义,就是像一把尺子(固定某一条件),不断向右(左)移动,不断更新所求答案。一般用来求满足条件的最小区间。

2.实现步骤:

  1. 初始化左右端点
  2. 不断扩大右端点,直至满足条件
  3. 如果直至终点也无法满足条件,则终止,否则更新结果
  4. 扩大左端点(右移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;
}
原文地址:https://www.cnblogs.com/eason9906/p/11754966.html