题意:给你初始字符串,要你给每个字符涂色,规定不同颜色的相邻字符可以交换,问你存不存在一种涂色方式能使字符串变得有序?
思路:我们按照贪心的思路,如果我前面有比我大的字符在我前面,我不是不肯定要交换,于是可以遍历比我大的字符,看他们在我前面的最大的编号是多少,然后加1.
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+1;
char s[maxn];
int n,mx=0,ans[maxn],Max[maxn];
int main()
{
scanf("%d",&n);
scanf("%s",s);
for(int i=0;i<n;++i)
{
int cnt=0;
for(int j=s[i]+1;j<='z';++j)
cnt=max(cnt,Max[j]);
cnt++;
Max[s[i]]=cnt;
ans[i]=cnt;
mx=max(mx,cnt);
}
printf("%d\n",mx);
for(int i=0;i<n;++i) printf("%d ",ans[i]);
}
E1String Coloring (easy version)
题意和思路:和上面差不多,就是把颜色规定了只能有两个,我们把上面的改一下,一旦mx大于2就输出no就行。
#include<bits/stdc++.h>
using namespace std;
const int maxn=200+1;
char s[maxn];
int n,mx=0,ans[maxn],Max[maxn];
int main()
{
scanf("%d",&n);
scanf("%s",s);
for(int i=0;i<n;++i)
{
int cnt=0;
for(int j=s[i]+1;j<='z';++j)
cnt=max(cnt,Max[j]);
cnt++;
Max[s[i]]=cnt;
ans[i]=cnt;
mx=max(mx,cnt);
}
if(mx>2) puts("NO");
else {
puts("YES");
for(int i=0;i<n;++i) printf("%d",ans[i]-1);
}
}