Codeforces 1296E1 - String Coloring (easy version)
题目大意:
给定一段长度为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)的更多相关文章
- E1. String Coloring (easy version)(贪心)
E1. String Coloring (easy version) time limit per test 1 second memory limit per test 256 megabytes ...
- Codeforces 1296E2. String Coloring (hard version)
这道题和HDU1257一模一样,一开始窝都用贪心直接解,没法理解为什么求一个最长下降序列,直到看了巨巨的题解,先给出一个定理,Dilworth's theorem,离散学不好,补题两行泪,该定理是说, ...
- E2. String Coloring (hard version)(贪心)
E2. String Coloring (hard version) time limit per test 1 second memory limit per test 256 megabytes ...
- codeforces Equalizing by Division (easy version)
output standard output The only difference between easy and hard versions is the number of elements ...
- Codeforces 1118F1 Tree Cutting (Easy Version) (简单树形DP)
<题目链接> 题目大意: 给定一棵树,树上的点有0,1,2三中情况,0代表该点无色.现在需要你将这棵树割掉一些边,使得割掉每条边分割成的两部分均最多只含有一种颜色的点,即分割后的两部分不能 ...
- Codeforces Round #617 (Div. 3) String Coloring(E1.E2)
(easy version): 题目链接:http://codeforces.com/contest/1296/problem/E1 题目一句话就是说,两种颜色不同的字符可以相互换位, 问,对这字符串 ...
- 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 ...
- 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 ...
- 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 ...
随机推荐
- CodeForces - 869A The Artful Expedient
题意:有两个序列X和Y,各含n个数,这2n个数互不相同,若满足xi^yj的结果在序列X内或序列Y内的(xi,yj)对数为偶数,则输出"Karen",否则输出"Koyomi ...
- 关于Orcale 11g 安装过程
1.前往Oracle官网下载相应安装包 https://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.h ...
- DRF项目之自定义分页器
在项目中,我们多需要自定义分页器. 代码实现: class PageNum(PageNumberPagination): '''自定义分页器''' # 每页显示个数 page_size = 10 pa ...
- Golang gin开源实例——表设计
UML Model 基本模型定义 type Model struct { ID int `gorm:"primary_key" json:"id"` Creat ...
- Linux学习-预习第五六七章节关于用户权限管理以及磁盘文件系统
- P1055 集体照
P1055 集体照 转跳点:
- VLC搭建RTSP服务器的过程
第一步,打开VLC 第二步:在媒体下拉菜单下!有一个子菜单“串流”如图所示: 点击“串流”子菜单 弹出一个窗口!如下图所示. 添加一个你要串流的本地文件,我刚才传给你的那个长一点的文件. 第三步,会出 ...
- mariadb galera启动问题
搭建了mariadb galera集群后,整个集群停掉后如何启动呢,我们要先启动那个节点呢,今天我尝试把集群机器全部停掉,然后任意启动一个节点,发现报如下的错误: 170620 21:32:55 [E ...
- 使用Kickstart+pxe自动化安装部署无人值守的linux服务器
Kickstart+pxe Kickstart无人职守安装RHEL5过程分享(详细图解版) 启动应用有:httpd.dhcpd.named.xinetd 无人职守自动批量安装linux系统超详细 参考 ...
- 4. 异步多级缓存架构+nginx数据本地化渲染