题意:每次操作可以加一个C或者一个P,第i次需要花费i-1个能量,最后字符串中,每包含一个CCPC能量就加1,问最多能有多少能量。
思路:分析后可以知道,每加一个C或者一个P,最后只能加一个CCPC,而第一次是免费加的,后面最小要花费1个能量,所以我们只加一次。
CCPC,子串有CCP、CPC、CCC。
所以我们考虑碰到这三种的时候直接加。
注意两点,
1、对于CCC,如果原串是CCCPC这样,我们就不能加。加了一个又破坏了一个等于没加。
2、对于CCP,如果原串是CCPC,那么直接跳到最后一个C的位置,不然下一个位置到了CPC加上去的话,也是加了一个又破坏了原来的一个
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e2+5;
const ll mod=1e9+7;
int main(){
int T;while(cin>>T){
while(T--){
int n;string s;cin>>n>>s;
int ans=0;
for(int i=0;i+3<n;i++){
if(s[i]=='C' && s[i+1]=='C' && s[i+2]=='P' && s[i+3]=='C') ++ans;
}
for(int i=0;i+2<n;i++){
if(s[i]=='C' && s[i+1]=='P' && s[i+2]=='C') { ///CPC
++ans;
break;
}
if(s[i]=='C' && s[i+1]=='C' && s[i+2]=='P') { ///CCP
if(i+3<n){
//原串是CCPC 直接跳到最后一个C的位置,这里i+=2 因为循环i会自增1
if(s[i+3]=='C') {
i+=2;
continue;
}
}
++ans;
break;
}
if(s[i]=='C' && s[i+1]=='C' && s[i+2]=='C') { ///CCC
if(i+4<n){
if(s[i+3]=='P' && s[i+4]=='C') continue;//原串不是CCCPC
}
++ans;
break;
}
}
cout<<ans<<endl;
}
}
return 0;
}