ZOJ 3985 - String of CCPC - [字符串处理]

题目链接: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;
    }
}

 

posted @ 2017-11-05 17:52  Dilthey  阅读(733)  评论(0编辑  收藏  举报