ZOJ 3983[思维/构造]

题目点击打开链接

题意

给一个字符串,其中只有a,o,g,当三个相同字符连在一起时释放大技能 
我们可以消除任意连续数量的字符  
问我们最大的释放大技能的数量是多少


输入
7
gggaaaooo
aaoogggoa
googgaaao
agogaooag
goooggaaa
gogogoaaa
gaogaogao
 
  
输出
3
3
2
1
3
2
1
先找aaa/ggg/ooo,若没有满足的则从a--o--g,开始先把删除a后的字符串进行查找ggg/ooo,在继续o(方法同前一句),继续g(同上),若刚开始就满足则直接输出ans(已满足条件ans==3),否则输出ans的加和后的值。
#include 

using namespace std;

string l,tmp;
int ans;

int cnt(string &tmp)
{
    int a=0,t=0;
    while(tmp.length()&&t<3){//找连续的三个字符
        t++;
        if(tmp.find("aaa",0)!=string::npos){//find 返回坐标 
            tmp.erase(tmp.find("aaa",0),3);
            a++;
        }
        else if(tmp.find("ggg",0)!=string::npos){
            tmp.erase(tmp.find("ggg",0),3);
            a++;
        }
        else if(tmp.find("ooo",0)!=string::npos){
            tmp.erase(tmp.find("ooo",0),3);
            a++;
        }
    }
//    printf("a=%d\n",a);
    return a;
}
int del(char c,string tmp)
{
    int f=0;
    int len = tmp.length();
    for(int i=0;i>l; 
        tmp = l;
        ans+=cnt(tmp);
//        printf("ans=%d\n",ans);
        string rep = tmp;
        if(ans!=3)
            ans+=max(max(del('a',rep),del('o',rep)),del('g',rep));
        printf("%d\n",ans);
        ans=0;
    }
    return 0;
}
#include

#include

#include

using namespace std;

char str[12], st[12], y[5] = {"0gao"};

int main()

{

    char ch;

    int t, i, j, flag;

    scanf("%d", &t);

    while(t--)

    {

        flag = 0;

        scanf("%s", str+1);

        for(i=1;i<=9;i++)

        {

            if(flag>=2 && str[i]==st[flag] && st[flag]==st[flag-1])

                flag -= 2;

            else

                st[++flag] = str[i];

        }

        if(flag==0)

            printf("3\n");

        else

        {

            for(j=1;j<=3;j++)

            {

                flag = 0;

                ch = y[j];

                for(i=1;i<=9;i++)

                {

                    if(str[i]==ch)

                        continue;

                    if(flag>=2 && str[i]==st[flag] && st[flag]==st[flag-1])

                        flag -= 2;

                    else

                        st[++flag] = str[i];

                }

                if(flag==0)

                {

                    printf("2\n");

                    break;

                }

            }


            if(j==4)

                printf("1\n");

        }

    }

    return 0;


}


你可能感兴趣的:(思维/构造,ZOJ)