//https://codeforces.com/contest/814/problem/B
//C. An impassioned circulation of affection
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 100;
vector<int>v[30];//存每个字符的位置
char s[maxn];
int main(){
int n;
cin >> n;
scanf("%s", s + 1);
for (int i = 1; i <= n; i++){
int x = s[i] - 'a';
v[x].push_back(i);
}
int q;
cin >> q;
for (int i = 1; i <= q; i++){
int x; char p;
scanf("%d %c", &x, &p);
int ans = x;
int k = p - 'a';
if (v[k].size() == 0){
printf("%d\n", x);
continue;
}
if (n - v[k].size() <= x){
printf("%d\n", n);
continue;
}
int begin = 0 , end = 0;//起始 终点
int cnt = 0;//记录走过多少边界 每次计算sum时需要减去cnt
int sum = 0;//中间需要被修改的个数
while (1){
while (end < v[k].size()-1 && sum <= x)
sum = v[k][++end] - v[k][begin] - 1 - cnt, cnt++;
if (sum < x){
ans = max(ans, x + cnt + 1);
break;
}
if (sum >= x){//超过范围
int h = sum - x;
int num = 0;
//判h==0因为可能右端点也包含
ans = max(ans, v[k][end] - v[k][begin] - h+(h==0));
}
sum -= v[k][begin + 1] - v[k][begin]-1;
begin++;
if (begin >= v[k].size())
break;
cnt--;
}
printf("%d\n", ans);
}
return 0;
}
Codeforces Round #418 (Div. 2) C. An impassioned circulation of affection(尺取法)
最新推荐文章于 2022-07-13 02:01:45 发布