某场CF B Octagons

题目:http://codeforces.com/gym/100004/attachments (需下载到本地,doc格式)

题意:如图

这是由多个八边形(不一定为正八边形)拼接在一起的图形。八边形的边由a,b,c三个字母构成,每条边对应一个字母,且同一个八边形的边只能由2种字母构成,相邻的不相等。判断给定的一个只由abc构成的字符串,是否能在图中围成一个封闭的图形。

思路:模拟。对于2个相邻一样的或者8个在同一个八边形内的可以直接去掉。而7个,6个,5个在同一个八边形内的,可以分别替换成1个,2个,3个在同一个八边形内的短路。用string对字符串的拼接操作比较简单。

(欠下的模拟债)

代码

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <string>

using namespace std;

const int N = 1e2;

string str;

string spilt(int x, int y) {
    string tmp = str.substr(x, y - x + 1);
    if (tmp.size() == 8 || tmp.size() == 2) {
        tmp = "";
    }
    else if (tmp.size() <= 7 && tmp.size() >= 5) {
        tmp = tmp.substr(1, 8 - tmp.size());
    }
    return str.substr(0, x) + tmp + str.substr(y + 1, str.size() - y);
}

bool check2() {
    for (int i = 1; i < str.size(); i++) {
        if (str[i] == str[i - 1]) {
            str = spilt(i - 1, i);
            return true;
        }
    }
    return false;
}

bool check(int p) {
    int cnt = 0;
    for (int i = 2; i < str.size(); i++) {
        if (i - cnt == p) {
            str = spilt(cnt, i - 1);
            cnt = i;
            return true;
        }
        if (str[i] != str[i - 2]) {
            cnt = i - 1;
        }
    }
    if (str.size() - cnt == p) {
        str = spilt(cnt, str.size() - 1);
        return true;
    }
    return false;
}

int main() {

    int t_case;
    scanf("%d", &t_case);
    for (int i_case = 1; i_case <= t_case; i_case++) {
        cin >> str;
        while (check2() || check(8));
        while (check(7)) {
            while (check2() || check(8));
        }
        while (check(6)) {
            while (check(7)) {
                while (check2() || check(8));
            }
        }
        while (check(5)) {
            while (check(6)) {
                while (check(7)) {
                    while (check2() || check(8));
                }
            }
        }
        if (str.empty())
            puts("closed");
        else
            puts("open");
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-31 00:05:26

某场CF B Octagons的相关文章

一场CF的台前幕后(上)——转

前奏 大约4月份的时候,业界毒瘤pyx噔噔噔跑过来说:“酷爱!我YY了一道题!准备当CF的C” 我当时就被吓傻了."Yet another Chinese round?" “区间取模,区间求和” 感觉这题还不错?不过pyx嫌水了…… 好办!当时我刚刚出完动态仙人掌不久,于是一拍脑袋说:把这个问题出到仙人掌上去! 当然被pyx鄙视了…… 后来一直就没啥动静,直到5月底的CTSC. 试机的时候pyx给我看了套他出的神题……里面有一道题……我不小心读成了下面这个样子: “给定n个m维的模2意

记第一场cf比赛

比赛感想 本来21:05开始的比赛,结果记成21:30了...晚了25分钟才开始[捂脸] 这次是Educational Round,所以还比较简单. 前两道题一眼看去模拟+贪心,怕错仔细看了好几遍题,很快切掉 第三题,dfs+贪心 一开始想得有点简单,少了几种情况,写代码时才发现问题-- 悲伤地发现 写+调 这道题用了我很长时间-(这叫什么?基础不牢,地动山摇!) 然后,居然只剩40分钟了-- 第四题,啊啊啊! 图论,我的痛! 果断跳过 第五题,额,不就是个线段树么? n<=10 \(^9\)

CF #392(2) C 暴力模拟

CF #392(2)  C. Unfair Poll 题意:n行m列人,老师点k次名.点名次序,每一行都是从1到m,但行是按1,2....(n-1),n,(n-1),(n-2)...1,2,3....(n-1),n.....求点完k次名后被点的最多的次数和最少的次数,以及给定的(x,y)被点次数. 总结:有点麻烦,但还是很好找规律,只是fst了,有时间再写一遍...还是太菜了,连着三场CF都是fst #include<bits/stdc++.h> using namespace std; #p

【CF】Codeforces Round #361 (Div. 2)

难得有想法写一整套题解 首先想说的是,这场CF,我感觉是div2极为不错的一场(对于中档选手<因为我就出了三题,还掉了一个-- 说笑了,感觉这一场很耐人寻味.就是那种抓破头皮想不出,知道做法后细细品味,有种   哦~~~~~这样啊~~~~好神奇!!! 的感觉 首先..秀一下战绩 不多说了 都在题里 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ A. Mike and Cellphone time limit per test 1 second memory limit per test 256 megaby

在青岛穷游打的cf codeforces Round #318 (Div. 2) A.Bear and Elections

这场cf是暑假集训后在青岛旅游打的一场,好累..... 题意:给出一个序列,要使a[1]大于a[2]~a[n],a[1]每次可以增加一,这个一从a[2]到a[[n]里面任意一个数减一扣除,求最少的步数 思路:要不断地修改值,并从中找出最大的,可以想到优先队列,还要保存下该数的编号,要知道在队首时是a[1].还有处里一种特殊情况,详见代码 总结:这道题并不难,我用了40多分钟,主要前面太急了,一开始并没有想到是优先队列,是一些其他的想法,只要合适一个样例就下手去做,导致有很明显的bug我竟然敲完代

【codeforces】【比赛题解】#915 Educational CF Round 36

虽然最近打了很多场CF,也涨了很多分,但是好久没写CF的题解了. 前几次刚刚紫名的CF,太伤感情了,一下子就掉下来了,不懂你们Div.1. 珂学的那场我只做了第一题--悲伤. 这次的Educational Round打的还可以,虽然吧没有涨分(因为我是紫色的啊). 做了前4题,后面3题也比较简单,陆续也做完了. 所以心情好,来写一篇题解! [A]花园 题意: 长度为\(k\)的线段,用若干个长度为\(a_i\)的线段,正好覆盖.(\(a_i|k\)) 给定\(n\)个\(a_i\),求出最小的\

小蒟蒻初次CF滚粗+爆炸记 (Codeforces Round #466 Div.2)

比赛链接:http://codeforces.com/blog/entry/57981 小蒟蒻今天初次在ZCDHJ张大佬的带领下,打了一场CF (张大佬cnblogs链接:https://www.cnblogs.com/ZCDHJ)' 英文完全看不懂,后面几题直接放弃,各位dalao请见谅 T1: 题目链接:http://codeforces.com/contest/940/problem/A 题目大意: 给你一个n个数的集合,要求你删掉若干数,其中最大的差不应该超过d,求最小删除量. (小蒟蒻

Codeforces Round #390 (Div. 2) 解题报告

时隔一个月重返coding…… 期末复习了一个月也不亏 倒是都过了…… 就是计组61有点亏 复变68也太低了 其他都还好…… 假期做的第一场cf 三道题 还可以…… 最后room第三 standing383简直人生巅峰…… 看楼上楼下都是两道题的 如果A题不错那么多估计能进前300了吧…… 这场倒是把之前两场的分加回来了 开头不错 这个假期争取紫名~ A.Lesha and array splitting 把给定的数组分割成几个区间 要求各个区间和不能为0 一开始没注意到分割之后的区间重新合成之

codeforces #305 div1 done

总算搞定了这一场比赛的题目,感觉收获蛮大 其中A,B,C都能通过自己的思考解决掉 D题思路好神,E题仔细想想也能想出来 以后坚持每两天或者一天做一场CF的div1的全套题目 除非有实在无法做出来的题目,每道题目还是都要写题解的 (我这算不算立flag? 本蒟蒻写的题解的链接: A:http://www.cnblogs.com/joyouth/p/5352953.html B:http://www.cnblogs.com/joyouth/p/5352932.html C:http://www.cn