1. 程式人生 > >ZOJ 3983[思維/構造]

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 <bits/stdc++.h>

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<len;){
        if(tmp[i]==c)tmp.erase(i,1),f++;
        else i++;
    }
    if(f){
        int p = cnt(tmp);
        if(p==0)return 1;// 如果沒有找到更多的連續 說明可以繼續消除返回1
        else return p;// 如果找到了 說明消除一個後 可以繼續消除返回p
    }
    else return 0;
}
//aaggaogoo
int main (void) {
    int n;
    scanf("%d ",&n);

    while(n--){
       getline(cin,l);// cin>>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<stdio.h>

#include<string.h>

#include<algorithm>

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;


}