题目大意:

给定一段长度为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. DNS 访问 Service【转】

    在 Cluster 中,除了可以通过 Cluster IP 访问 Service,Kubernetes 还提供了更为方便的 DNS 访问. kubeadm 部署时会默认安装 kube-dns 组件. ...

  2. 编程题目:输入一个链表,输出该链表中倒数第k个节点

    两种方法 1.在链表的初始化数据中加入 num 数据, 每添加一个节点,num加1,每删除一个节点,num减1 查找倒数第k个元素,即 指向第一个节点的指针向后移动 num - k 步. 2.使用两个 ...

  3. Tomcat删除时问题——eclipse部署tomcat时弹出Resource'/Servers' does not exist

    如果你删除一个项目的Servers文件,或者相应文件损坏等,会出现错误, Resource '/Servers' does not exist 那么就需要把它在控制台出的Servers下所部署的Tom ...

  4. 【LeetCode】排列硬币

    [问题]你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币.给定一个数字 n,找出可形成完整阶梯行的总行数.n 是一个非负整数,并且在32位有符号整型的范围内. [ ...

  5. 12 MySQL存储过程与函数

    存储过程和函数     存储过程和函数是事先经过编译并存储在数据库中的一段SQL语句的集合.     调用存储过程和函数可以简化应用开发人员的工作,减少数据在数据库和应用服务器之间的传输,提高数据处理 ...

  6. P1049 数列的片段和

    P1049 数列的片段和 转跳点:

  7. WIN10打开资源管理器显示该文件没有与之关联的程序来执行该操作.请安装应用,请在“默认应用设置”..关联 —— 解决方案

    win+R,输入regedit,分别在HKEY_CLASSES_ROOT\piffileHKEY_CLASSES_ROOT\InternetShortcutHKEY_CLASSES_ROOT\lnkf ...

  8. Bulma CSS - 开始

    Bulma CSS框架教程 Bulma CSS – 简介 Bulma CSS – 开始 Bulma CSS – CSS类 Bulma CSS – 模块化 Bulma CSS – 响应式 有数种方法可以 ...

  9. javascript 对象只读

    var person = {}; Object.defineProperty(person, "name", { writable: false, value: "nic ...

  10. MacOS通过ssh连接基于Virtualbox的Ubuntu虚拟机

    以前总是用Windows软件putty进行ssh连接,今天尝试使用macos. 实验环境:主机:macos 10.15.3 客户机:Ubuntu 18.04 默认情况下,Ubuntu没有安装SSH,需 ...