2.大闹蟠桃园【算法赛】 - 蓝桥云课 (lanqiao.cn)
预处理一个dp数组
其中dp[i]表示第i条道路摘得的蟠桃的数量
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int dp[2*N];
signed main()
{
int n;cin>>n;
string s;cin>>s;
//初始化
if(s[0]=='Q') dp[0] =1;
else dp[0]=0;
//预处理
for(int i=1;i<2*n;i++) //破环成链
{
int idx=i%n; //比如第n+1个位置实际上就是第一个位置
if(s[idx]=='Q') dp[i]=dp[i-1]+1; //如果当前道路没有天兵把守,摘得的蟠桃数量+1
else dp[i]=0; //否则的话所有的蟠桃被没收
}
int sum=0;
//计算每条道路最大无天兵把守长度
//并累加到sum(因为有多个分身)
for(int i=0;i<n;i++)
{
sum+=max(dp[i],dp[n+i]);
}
cout<<sum<<endl;
return 0;
}