题目翻译

问当前字符后的第一个 $\tt{g}$ 与它的距离最大是多少。

当前字符可能有很多个。

题目思路

我们把目前找到的当前字符的位置记录下来,找到最早的,记录一下时间差,取个最大。

但显然我们不能对每一个去找,必须几个打包一找。

我用 queue 模拟题意,详情见代码。

由于当前的可能要到下一个循环才能看见 $\tt{g}$,所以要循环两次。

时间复杂度 $\mathcal O(n)$。

题目代码

#include<bits/stdc++.h>
using namespace std;
int t,n,z;
char c[200020];
char tmp;
queue<int>q;
int ans=INT_MIN;
void solve()
{
    ans=INT_MIN;
    while(!q.empty())
    {
        q.pop();
    }
    scanf("%d %c%s",&n,&tmp,c+1);
    for(int i=1;i<=n+n;i++)
    {
        z=i;
        if(z>n)
        {
            z-=n;
        }
        if(i<=n&&c[z]==tmp)
        {
            q.push(z);
        }
        if(c[z]=='g'&&!q.empty())//找到g并且有当前字符
        {
            ans=max(ans,i-q.front());//取一个最大的时间差
            while(!q.empty())
            {
                q.pop();
            }
        }
    }
    printf("%d\n",ans);
}
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        solve();
    }
    return 0;
}
/*
6
5 r
rggry
1 g
g
3 r
rrg
5 y
yrrgy
7 r
rgrgyrg
9 y
rrrgyyygy
*/
最后修改:2023 年 04 月 22 日
v我50吃疯狂星期四