题意
给定一个串,由C和P两种字符构成,定义“CCPC”为good,所给定的串的价值就是该串含有的good串的个数。然后为了让这个串的价值更大,可以插入C或者P字符来增加good串的个数,但是第i次操作会花费i-1的代价,现在要求最终 串的价值-所花的代价 的最大值。
思路
对于增加字符操作,第一次是免费的,从第二次开始就要花费大于等于增加good串数的代价,所以如果要增添字符只能加1次。然后我们先遍历一下原来的串,看有多少个“CCPC”,接着去找能够增添1个字符就产生“CCPC”的子串,毫无疑问只有3种子串,分别是:“CCP”,“CPC”,“CCC”,所以要做的第二件事就是去找原串里面有没有这样的子串,有的话找到一个就不用再找了,然后最终答案就是之前找到的“CCPC”的个数+1。这边要注意一点,找那三种子串的时候不能跟“CCPC”重复,比如说“CCP”的下一个字母不能是‘C’,“CPC”的前一个字母不能是‘C’,“CCP”的后两个字母不能是“PC”,不然的话答案会不准确。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
char s[N];
int main(){
int t,n;
scanf("%d",&t);
while (t--){
scanf("%d",&n);
scanf("%s",s);
int ans=0;
for (int i=0;i<n;i++){
if (s[i]=='C'&&s[i+1]=='C'&&s[i+2]=='P'&&s[i+3]=='C') ans++;
}
int flag=0;
for (int i=0;i<n;i++){
if (i==0&&s[i]=='C'&&s[i+1]=='P'&&s[i+2]=='C'||s[i]=='C'&&s[i+1]=='P'&&s[i+2]=='C'&&s[i-1]!='C') flag=1;
else if (s[i]=='C'&&s[i+1]=='C'&&s[i+2]=='P'&&s[i+3]!='C') flag=1;
else if (s[i]=='C'&&s[i+1]=='C'&&s[i+2]=='C'&&!(s[i+3]=='P'&&s[i+4]=='C')) flag=1;
if (flag){
ans++;
break;
}
}
printf("%d\n",ans);
}
return 0;
}