思路:
先理解題意,題目要求把數據用1,2分別染色,然後把被1染色的數據組成的串和被2染色的數據組成的串,分別拿出來,要求兩個串接起來是一個非遞減的串。
首先我們要把數據按照從小到大排序,由於數據量大且數據範圍爲0-9,所以應該使用桶排序,不然容易超時。然後把排序後的數據和原數據匹配(如圖方式,藍色爲染成1,紅色爲染成2),第一次匹配的染色爲1,第二次的染色爲2.
下面給出代碼:
#include <bits/stdc++.h>
using namespace std;
int book[10000001];
int tong[11];
char s[10000001];
int main()
{
int n,i,j,flag=1;
scanf("%s",s);
n=strlen(s);
for(i=0;i<n;i++)//桶排序
{
tong[s[i]-'0']++;
}
j=0;
for(i=0;i<n;i++)//第一次染色,染成1
{
if(tong[j]==0)//如果桶中數據沒了,則移到下一個桶
{
j++;
i--;//因爲外層for循環有個i++,如果這裏不減一會漏掉一個數據
continue;
}
if(s[i]-'0'==j)//桶中數據與原數據匹配,染色爲1,用book數組記錄
{
tong[j]--;
book[i]=1;
}
}
for(i=0;i<n;i++)//第二次循環染色爲2,同理
{
if(tong[j]==0)
{
j++;
i--;
continue;
}
if(s[i]-'0'==j&&book[i]==0)
{
tong[j]--;
book[i]=2;
}
}
for(i=0;i<=9;i++)//如果桶中還有數據,說明沒有全部染色,輸入'-'
{
if(tong[i]!=0) flag=0;
}
if(flag==0) printf("-");
else//輸出染色結果
{
for(i=0;i<n;i++)
{
printf("%d",book[i]);
}
}
return 0;
}