ZOJ 3983[思維/構造]
阿新 • • 發佈:2019-02-18
題意
給一個字串,其中只有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; }