2017秦皇岛CCPC C - Crusaders Quest

本文介绍了一个编程挑战,通过分析字符串中特定字符的排列组合来计算能消除连续三个相同字符的最大次数。文章提供了一种实现思路及代码示例,探讨了不同情况下的解决方案。

题意:给了一个长度为9的字符串,g、a、o三个字符分别有三个,问你能消除连续三个相同字符的次数有多少。
思路:容易知道答案就是[1,3]之间的值。
、3的情况就是,有两种字符都是3个挨着的,比如gggaaaooo,goooaaagg,goooggaaa这样
先把那两个三个连续的消掉,第三种字符也可以三个一起消除。
还有gooaaaogg 这种,即231,中间是一种字符连续的三个,消除后,左边的1和右边的2是同一种类型也能消除。同理132也可以消除,如goaaaoogg。

、2的情况不好判断,那么我们去判断1的情况,很明显要三个都消掉,我们只需要对于每种字符,看最左边和最右边的两个字符,他们中间是不是夹着其他两种字符,如果为了那这种字符消掉三个,那么一定要把中间消掉,这样把剩下两种消除了,最多只有1了。
比如gaoogaoga,第一个g和最后一个g之间包含了a和o,第一个a和最后一个a之间包含了g和o,第一个o和最后一个o之间包含了a和g,所以这样只有1次

前两种情况都不满足的话,那么就是两次了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+5;
const ll mod=1e9+7;
struct node{
    int x;
    char c;
}z[15];
string a;
bool check(char x,char y,char z){
    for(int i=0;i<9;i++){
         for(int j=8;j>=0;j--){
            if(a[i]==x && a[j]==x){
                int cnt1=0,cnt2=0;
                for(int k=i+1;k<j;k++){
                    cnt1 |= a[k]==y;
                    cnt2 |= a[k]==z;
                }
                 return (cnt1&&cnt2);
            }
        }
    }
}
int main(){
    int T;while(cin>>T){
            while(T--){
               cin>>a;
                int num=0;
                int CNT=0;
                int now=1;
                char q=a[0];
                for(int i=1;i<9;i++){
                    if(a[i]==q) {
                        ++now;
                    }
                    else{
                        z[++num]={now,q};
                        CNT+= now==3;
                        now=1;
                        q=a[i];
                    }
                }
                 CNT+= now==3;
                z[++num]={now,q};
                int F=0;
                for(int i=2;i<num;i++){
                    if(z[i-1].x==1&&z[i+1].x==2 && z[i].x==3 && z[i-1].c==z[i+1].c || z[i-1].x==2&&z[i+1].x==1 && z[i].x==3 && z[i-1].c==z[i+1].c)F=1;
                }
                if(F || CNT>=2) puts("3");
                else if(check('g','a','o') && check('a','g','o') && check('o','a','g')) puts("1");
                else puts("2");
            }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我不会c语言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值