Description

There are nnn blocks arranged in a row and numbered from left to right, starting from one. Each block is either black or white.

You may perform the following operation zero or more times: choose two adjacent blocks and invert their colors (white block becomes black, and vice versa).

You want to find a sequence of operations, such that they make all the blocks having the same color. You don’t have to minimize the number of operations, but it should not exceed 3⋅n3⋅n3⋅n. If it is impossible to find such a sequence of operations, you need to report it.

Input

The first line contains one integer n(2≤n≤200)n(2≤n≤200)n(2≤n≤200) — the number of blocks.

The second line contains one string s consisting of n characters, each character is either “W” or “B”. If the i-th character is “W”, then the i-th block is white. If the i-th character is “B”, then the i-th block is black.

Output

If it is impossible to make all the blocks having the same color, print −1−1−1.

Otherwise, print an integer k(0≤k≤3⋅n)k(0≤k≤3⋅n)k(0≤k≤3⋅n) — the number of operations. Then print kkk integers p1,p2,…,pk(1≤pj≤n−1)p_1,p_2,…,p_k (1≤p_j≤n−1)p1​,p2​,…,pk​(1≤pj​≤n−1), where pjp_jpj​ is the position of the left block in the pair of blocks that should be affected by the jjj-th operation.

If there are multiple answers, print any of them.

题意

给定一串黑白文本,每次可以将其中相邻2个颜色翻转,求一个可行的操作序列使得操作后颜色相同。

如果不能找到输出-1

思路

一开始看到n<=200n<=200n<=200直接打了一发爆搜+记忆化,然后MLE炸到飞起……

正解是假定操作后全白,从头扫到尾一次,假定全黑,从头扫到尾一次,看看能否成功。

比如:我们要全白,而此时颜色是 黑白黑黑黑

可以将黑视作高台阶,白视作低台阶,然后一路推过去,最后能推平就可以了。



推平位置1后,往后找到位置2,推平位置2后,2 3都平了,再往后遍历找到位置4,推平位置4后,全部推平,合法。

因此操作序列就为:1 2 4

显然这样操作只会有2种结果:全平或者最后一个不平。

全黑全白两个都扫一遍就好了,复杂度O(n)O(n)O(n)

Code

#include <cstdio>
#include <cstring>
using namespace std;
int n,len;
char all[201];
char temp[201];
int path[201];
int tot;
bool checkblack()
{
memcpy(temp,all,sizeof(all));
tot = 0;
for(int i = 1;i<len;++i)
{
if(temp[i] == 'W')
{
temp[i] = 'B';
temp[i+1] = (temp[i+1] == 'W' ? 'B' : 'W');
path[++tot] = i;
}
}
return temp[len] == 'B';
}
bool checkwhite()
{
memcpy(temp,all,sizeof(all));
tot = 0;
for(int i = 1;i<len;++i)
{
if(temp[i] == 'B')
{
temp[i] = 'W';
temp[i+1] = (temp[i+1] == 'W' ? 'B' : 'W');
path[++tot] = i;
}
}
return temp[len] == 'W';
}
int main()
{
scanf("%d",&n);
scanf("%s",all+1);
len = strlen(all+1);
if(checkblack() || checkwhite())
{
printf("%d\n",tot);
for(int i =1 ;i<=tot;++i)
printf("%d ",path[i]);
}
else
printf("-1");
return 0;
}

[Codeforces #608 div2]1272B Blocks的更多相关文章

  1. [Codeforces #608 div2]1271D Portals

    Description You play a strategic video game (yeah, we ran out of good problem legends). In this game ...

  2. [Codeforces #608 div2]1271C Shawarma Tent

    Description The map of the capital of Berland can be viewed on the infinite coordinate plane. Each p ...

  3. [Codeforces #608 div2]1271A Suits

    Description A new delivery of clothing has arrived today to the clothing store. This delivery consis ...

  4. Codeforces #180 div2 C Parity Game

    // Codeforces #180 div2 C Parity Game // // 这个问题的意思被摄物体没有解释 // // 这个主题是如此的狠一点(对我来说,),不多说了这 // // 解决问 ...

  5. Codeforces #541 (Div2) - E. String Multiplication(动态规划)

    Problem   Codeforces #541 (Div2) - E. String Multiplication Time Limit: 2000 mSec Problem Descriptio ...

  6. Codeforces #541 (Div2) - F. Asya And Kittens(并查集+链表)

    Problem   Codeforces #541 (Div2) - F. Asya And Kittens Time Limit: 2000 mSec Problem Description Inp ...

  7. Codeforces #541 (Div2) - D. Gourmet choice(拓扑排序+并查集)

    Problem   Codeforces #541 (Div2) - D. Gourmet choice Time Limit: 2000 mSec Problem Description Input ...

  8. Codeforces #548 (Div2) - D.Steps to One(概率dp+数论)

    Problem   Codeforces #548 (Div2) - D.Steps to One Time Limit: 2000 mSec Problem Description Input Th ...

  9. 【Codeforces #312 div2 A】Lala Land and Apple Trees

    # [Codeforces #312 div2 A]Lala Land and Apple Trees 首先,此题的大意是在一条坐标轴上,有\(n\)个点,每个点的权值为\(a_{i}\),第一次从原 ...

随机推荐

  1. Linux - 监控工具Conky

    主题Harmattan,https://www.jianshu.com/p/5c8d4a1f4c91,这个主题在deepin linux下有黑框背景,因为是伪透明,所以选择黑色背景的主题即可

  2. Write-Up-wakanda-1

    关于 下载地址:点我 哔哩哔哩:哔哩哔哩 祖传开头 信息收集 这里用vm虚拟机可能有一点问题,因为官方的是用vbox虚拟机导出的镜像文件.所以这次使用vbox虚拟机. ➜ ~ ip a show de ...

  3. word2vec词向量处理中文语料

    word2vec介绍 word2vec官网:https://code.google.com/p/word2vec/ word2vec是google的一个开源工具,能够根据输入的词的集合计算出词与词之间 ...

  4. 1.ORM介绍,基本配置及通过ORM框架创建表

    1.介绍 ORM全拼Object-Relation Mapping(对象-关系映射) 作用:主要实现模型对象到关系数据库数据的映射 通过ORM框架作为一个中间者或者是一个桥梁,开发者通过定义模型类,属 ...

  5. 全局注册Vue.directive

    1.src目录下新建directives文件 export default { install: function(Vue, option) { // 1:el指绑定的dom元素 // 2:bindi ...

  6. 关于and 和or的执行优先级问题分析

    题目:列出本店价低于60或者高于100.并且商品点击数大于628的商品. 按照下面两种写法,得到的结果是不同的. 第一种:结果数据中有点击数为628的记录,显然不符合题目要求. SELECTgoods ...

  7. 物联网协议CoAP协议学习

    CoAP:Constrained Application Protocol协议是为物联网中资源受限的设备制定的应用层协议,即简化版的基于UDP的HTTP协议.其核心内容为资源抽象.REST式交互可扩展 ...

  8. C语言笔记 14_标准库&assert&ctype&errno&float&limits

    C 标准库 <assert.h> 简介 C 标准库的 assert.h头文件提供了一个名为 assert 的宏,它可用于验证程序做出的假设,并在假设为假时输出诊断消息. 已定义的宏 ass ...

  9. JAVA版StarDict星际译王简单实现

    由胡正开发的星际译王是Linux平台上很强大的一个开源的翻译软件(也有Windows版本的)支持多种词库.多种语言版本.尤其词库设计比较合理.之前看到一篇博文<星际译王词库应用-自制英汉词典&g ...

  10. zabbix server 安装部署

    一:安装zabbix服务端 1.部署准备 命令:iptables -F     #关闭防火墙命令:systemctl stop firewalld    #关闭防火墙 设置解析,自建yum源 命令:c ...