[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

Problem Lang Verdict Time Memory
E1 - String Coloring (easy version) GNU C++11 Accepted 31 ms 0 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;
}


 

发布了537 篇原创文章 · 获赞 529 · 访问量 44万+

猜你喜欢

转载自blog.csdn.net/mrcrack/article/details/104282917
今日推荐