[codeforces 1296E1] String Coloring (easy version) 当前字符必须加入+字典序

[codeforces 1296E1] String Coloring (easy version) 当前字符必须加入+字典序

总目录详见https://blog.csdn.net/mrcrack/article/details/103564004

在线测评地址https://codeforces.com/contest/1296/problem/E1

ProblemLangVerdictTimeMemory
E1 - String Coloring (easy version) GNU C++11Accepted31 ms0 KB

能手动将样例模拟得出,那么编程的希望就能大增
思路:自左向右加入字符,当前字符必须加入,若比左边相邻字符字典序大或相等,正常加入,0,1值与左边字符同
若比左边相邻字符字典序小,0,1值与左边字符同反,加入后,要按0,1值处理,若能处理成字典序,继续下一个字符插入,
若不能,则打印NO.

思路若不明白,请看下面例子的处理过程

9
abacbecfd
YES
解释如下

加入a
a
0

加入b
ab
00

加入a
aba
001
处理后
aab
010

加入c
aabc
0100

加入b
aabcb
01001
处理后
aabbc
01010

加入e
aabbce
010100

加入c
aabbcec
0101001
处理后
aabbcce
0101010

加入f
aabbccef
01010100

加入d
aabbccefd
010101001
处理后
aabbccdef
010101100

故YES

AC代码如下

#include <cstdio>
#include <algorithm>
#define maxn 210
using namespace std;
char s[maxn];
struct node{
	int seq;
	char c;
	int val;
}p[maxn];
void swap(node &a,node &b){//&引用
	node t;
	t=a,a=b,b=t;
}
int cmp(node a,node b){
	return a.seq<b.seq;
}
int main(){
	int n,i,j;
	scanf("%d%s",&n,s+1);
	for(i=1;i<=n;i++)p[i].seq=i,p[i].c=s[i];
	p[i].val=0;
	for(i=2;i<=n;i++)
		if(p[i].c>=p[i-1].c)p[i].val=p[i-1].val;
		else{//p[i].c<p[i-1].c
			p[i].val=!p[i-1].val;//取反
			for(j=i;j>=2;j--)
				if(p[j].c<p[j-1].c){
					if(p[j].val!=p[j-1].val)swap(p[j],p[j-1]);
					else{
						printf("NO\n");
						return 0;
					} 
				}else break;
		}
	sort(p+1,p+1+n,cmp);
	printf("YES\n");
	for(i=1;i<=n;i++)printf("%d",p[i].val);
	printf("\n");
	return 0;
}


 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值