题目大意:

给定一段长度为n的字符串s

你需要给每个字符进行涂色,然后相邻的不同色的字符可以进行交换

需要保证涂色后能通过相邻交换把这个字符串按照字典序排序(a~z)

你只有两种颜色可以用来涂

问是否存在这么一种涂色方案满足题意

存在,输出YES,再用01表示两种不同的颜色,把涂色方案输出(如果有多种,输出任意一种)

不存在,输出NO

解题思路 1:

因为只有两种颜色可以用来涂

相同颜色彼此不能交换

所以同一种颜色组成的序列绝对是非严格递增的

那么就用mx记录一种颜色代表的非严格递增的序列到某个位置时的最大字符,pmx记录另一种颜色代表的到某个位置时的最大字符

只要在找第一种颜色时出现了一个比最大值小的,就把他推给第二种颜色

如果也比第二种颜色最大值小,说明至少得三种颜色才能满足,此情况直接输出NO

#include<bits/stdc++.h>
using namespace std;
void solve(){
int n,i;
string s,ans="";
cin>>n>>s;
char mx='a',pmx='a';
for(i=;i<n;i++){
if(s[i]>=mx){
mx=max(mx,s[i]);
ans+="";
}
else{
if(pmx<=s[i]){
ans+="";
pmx=max(pmx,s[i]);
}
else{
cout<<"NO\n";
return;
}
}
}
cout<<"YES\n"<<ans;
}
int main(){
ios::sync_with_stdio();
cin.tie();cout.tie();
solve(); return ;
}

解题思路 2:

※该思路可直接用于题 E2 hard 版本

可以引入一个 r 数组,开26个空间代表26种字母

这个数组 r[i] 的值代表 第 i 个字母在前面涂的颜色最大编号是多少,0表示没出现过

遍历这个字符串,每遍历到一个字母时,从当前字母后一个位置开始往后再遍历这个数组,即找比当前字母要大的所有字母中编号最大的那个字母的编号

根据解题思路1,如果一个字符比一种颜色最大值要小,那么就把它推给下一种颜色

如果这个过程所有颜色都按照从1开始递增的顺序来,那么,这个字符的颜色编号会比前面的比他大的字符中编号最大的那个编号还要大

就可以得出结论,每次找比当前字母大的所有字母中涂色方案最大的编号+1,即为当前字母涂色方案

只要涂色方案出现大于2种,直接输出NO

#include<bits/stdc++.h>
using namespace std;
void solve(){
int n,i,j,d,r[]={};
string s;
cin>>n>>s;
string ans;
for(i=;i<n;i++){
d=;
for(j=s[i]-'a'+;j<;j++)//从当前字母后一个位置开始往后找
d=max(d,r[j]+);
r[s[i]-'a']=d;
if(d>){
cout<<"NO";
return;
}
ans+=((d-)?"":"");
}
cout<<"YES\n"<<ans;
}
int main(){
ios::sync_with_stdio();
cin.tie();cout.tie();
solve(); return ;
}

解题思路 3:

※该思路可直接用于题 E2 hard 版本

因为相同颜色彼此不能交换,所以必定是已经有顺序的

那么就可以得到这一种想法,编号从1开始,从头到尾遍历出一条非严格递增的标记为颜色0,如果标记出来的数量和小于n(即还有一些字符没有被标记),那么就加一种颜色,重新再来一遍,如果还是没有全部涂起来,说明颜色至少要3种,直接返回NO

#include<bits/stdc++.h>
using namespace std;
void solve(){
int n,i,done=,cur=;
char mx;
string s;
cin>>n>>s;
vector<int> ans(n,-);
while(done<n){
mx='a';
if(cur>){
cout<<"NO";
return;
}
for(i=;i<n;i++){
if(ans[i]==-&&s[i]>=mx){
mx=s[i];
done++;
ans[i]=cur;
}
}
cur++;
}
cout<<"YES\n";
for(i=;i<n;i++)
cout<<ans[i];
}
int main(){
ios::sync_with_stdio();
cin.tie();cout.tie();
solve(); return ;
}

Codeforces 1296E1 - String Coloring (easy version)的更多相关文章

  1. E1. String Coloring (easy version)(贪心)

    E1. String Coloring (easy version) time limit per test 1 second memory limit per test 256 megabytes ...

  2. Codeforces 1296E2. String Coloring (hard version)

    这道题和HDU1257一模一样,一开始窝都用贪心直接解,没法理解为什么求一个最长下降序列,直到看了巨巨的题解,先给出一个定理,Dilworth's theorem,离散学不好,补题两行泪,该定理是说, ...

  3. E2. String Coloring (hard version)(贪心)

    E2. String Coloring (hard version) time limit per test 1 second memory limit per test 256 megabytes ...

  4. codeforces Equalizing by Division (easy version)

    output standard output The only difference between easy and hard versions is the number of elements ...

  5. Codeforces 1118F1 Tree Cutting (Easy Version) (简单树形DP)

    <题目链接> 题目大意: 给定一棵树,树上的点有0,1,2三中情况,0代表该点无色.现在需要你将这棵树割掉一些边,使得割掉每条边分割成的两部分均最多只含有一种颜色的点,即分割后的两部分不能 ...

  6. Codeforces Round #617 (Div. 3) String Coloring(E1.E2)

    (easy version): 题目链接:http://codeforces.com/contest/1296/problem/E1 题目一句话就是说,两种颜色不同的字符可以相互换位, 问,对这字符串 ...

  7. Codeforces Round #540 (Div. 3) F1. Tree Cutting (Easy Version) 【DFS】

    任意门:http://codeforces.com/contest/1118/problem/F1 F1. Tree Cutting (Easy Version) time limit per tes ...

  8. Codeforces Round #540 (Div. 3) D1. Coffee and Coursework (Easy version) 【贪心】

    任意门:http://codeforces.com/contest/1118/problem/D1 D1. Coffee and Coursework (Easy version) time limi ...

  9. Codeforces Round #521 (Div. 3) F1. Pictures with Kittens (easy version)

    F1. Pictures with Kittens (easy version) 题目链接:https://codeforces.com/contest/1077/problem/F1 题意: 给出n ...

随机推荐

  1. 使用nginx做反向代理来访问tomcat服务器

    本次记录的是使用nginx来做一个反向代理来访问tomcat服务器.简单的来说就是使用nginx做为一个中间件,来分发客户端的请求,将这些请求分发到对应的合适的服务器上来完成请求及响应. 第一步:安装 ...

  2. VUE - mapState 辅助函数(简化)

    1,第一种 <template>   <div id="app">     <p> {{count}} </p>     <p ...

  3. tomcat多实例配置

    有一台server上跑个tomcat的实例的情况,我遇到过这种情况,毕竟把多个应用部署到一个实例中,如果某个应用出了问题,导致tomcat奔溃,其他应用也gg了.闲话到此. 通常部署多实例就是解压多个 ...

  4. Spring Boot -- 认识Spring Boot

    在前面我们已经学习过Srping MVC框架,我们需要配置web.xml.spring mvc配置文件,tomcat,是不是感觉配置较为繁琐.那我们今天不妨来试试使用Spring Boot,Sprin ...

  5. MQTT 协议学习:Retained(保留消息) 与 LWT(最后遗嘱)

    背景导入 让我们来看一下这个场景: 你有一个温度传感器,它每三个小时向一个 Topic 发布当前的温度.那么问题来了,有一个新的订阅者在它刚刚发布了当前温度之后订阅了这个主题,那么这个订阅端什么时候能 ...

  6. golang开启随机端口并获取端口

    listener, err := net.Listen("tcp", ":0") if err != nil { panic(err) } fmt.Printl ...

  7. 关于SSM中mybatis向oracle添加语句采用序列自增的问题

    在SSM向oracle数据库中插入语句时,报错如下: ### Error updating database.  Cause: java.sql.SQLException: 不支持的特性 ### SQ ...

  8. js使用new操作符创建对象

    转 在编写js代码时,我们有时会需要使用函数来模拟java中的类,并用它来产生对象,在定义了一个构造函数之后我们需要使用new操作符来调用调用函数才能得到我们想要的对象.例如: function Co ...

  9. word中替换内容

    参考了一篇文章 然后做了如下修改  用python的win32com模块替换word中的文字搞定批量打印奖状 python 操作 office python操作word # -*- coding: u ...

  10. 106-PHP查看类成员属性

    <?php class mao{ //定义猫类 public $age; //定义多个成员属性 protected $weight; private $color; } $mao1=new ma ...