题目链接:​​http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3985​

 

题意:

给出一个长度为n的字符串,全部由'C'和'P'组成;

then,可以在原有字符串的基础上添加任意多个’C’或’P’,每次添加一个就要花费一些 $value$,第 i 次添加所花费的 $value = i - 1$;

在任意的地方只要组成”CCPC”就可以获得 1 单位的 $value$,问你到最后可以获得最多多少单位的 $value$。

 

题解:

观察一下就可以知道,任何添加两个及以上字符的行为都是没有价值增加的。

所以,最多只需要增加一个字符(第一个字符是“免费”的字符)。

先遍历把"CCPC"找出来,然后剩下去判断是否可以利用"CCC"或"CCP"或"CPC"来生成目标字符串"CCPC";

另外, 由于找到的"CCC"有可能是"CCCPC"的前三个字符,那么如果添加一个字符"P",就变成"CCPCPC",这样显然会破坏一个原本就存在的"CCPC",

这样的行为显然是不赚的,而且也会浪费你唯一一次免费字符的机会,所以还不如不加这个字符,所以遇到"CCC"时需要特判一下。

 

AC代码:



#include<bits/stdc++.h>
using namespace std;

int n;
string str;

int main()
{
int T;
for(cin>>T;T;T--)
{
cin>>n>>str;
int value=0;
bool flag=0;
for(int i=0;i<n;i++)
{
if(str.substr(i,4)=="CCPC")
{
value++;
i+=2;
continue;
}
if(!flag)
{
string tmp=str.substr(i,3);
if(tmp=="CCC" || tmp=="CCP" || tmp=="CPC")
{
if(tmp=="CCC" && str.substr(i+1,4)=="CCPC") continue; //特判
value++;
flag=1;
}
}
}
cout<<value<<endl;
}
}