Problem - 1744C - Codeforces
题意:
大概意思就是说,要求在某时刻下红绿灯状态为c,要找一个能确定通过该红绿灯的时间
题解:
根据红绿灯会出现循环的现象,我们可以将红绿灯字符串s重复两次(避免漏掉前面和后面连续的情况),然后找与下一个绿灯之间的区间的最大值
也就是说,枚举每一个状态为c的点,找到与下一个绿灯之间的区间的最大值即为该题的解
代码如下:
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
void sl()
{
int n,ans = 0;
char ch,op;
string str;
cin >> n >> ch;
cin >> str;
str = str + str; // 将红绿灯字符串重复两次,以免漏掉前面和后面连续的情况
for (int i = 0; i < str.size(); ++i)
{
if (str[i] == ch)
{
int sum = 0;
while(str[i] != 'g' && i < str.size()) // 找与下一个路灯之间的区间的最大值
{
sum++; // 用sum来记录长度
i++;
}
ans = max(ans,sum); // 找出最大值,这样就能确保一定能通过该红绿灯
}
}
cout << ans << endl;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int T;
cin >> T;
while(T--) sl();
return 0;
}