[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;
}