当前位置: 代码迷 >> 综合 >> 2017秦皇岛CCPC C - Crusaders Quest
  详细解决方案

2017秦皇岛CCPC C - Crusaders Quest

热度:78   发布时间:2024-02-27 11:30:56.0

题意:给了一个长度为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;
}
  相关解决方案