参考妖精のブログ
以下は、正しさの私の解釈の一部です
スタックの二つの要素が一意に決定されるように、スタックに素子配列ので、私たちは、スタック1 2前スタックに入ることができないので、スタック1内に高度スタックを優先し、可能な限り小さく辞書の前に順序を保証しなければなりません
- 我々は、特定の配列をプッシュする必要があるので、一定の相対的な順序C、すなわちA、明らかスタックの特定の順序で
- 我々は要素をソートするので、そうスタックの相対的順序は、特定の定数、すなわち、B、Dの相対的な順序であること
- プルーフYXC教師、唯一つのスタック、配列のスタックとoutは一定、すなわちA、B、Cの相対的な順序、特定のD相対的順序である場合
しかし、B、C、および、Dの相対的な順序の相対的順序は不明です
スタック1に対応するA、B、C、スタック2、我々は正しい辞書式に、スタック内のスタック上のコードすることができるので
、D 1は、スタックに対応し、スタック2、我々はスタック内のスタック上のコードすることができるので、出力Dと、実際のAにおいて、Dは良好です
したがって、我々は、決定D、缶、すなわち全ての隣接スイッチングD、の相対的な順序を変更することなく、前提を交換する必要があります
コードは次のように、ハックすることを歓迎です
#include<bits/stdc++.h>
using namespace std;
#define go(i,a,b) for(int i=a;i<=b;++i)
#define com(i,a,b) for(int i=a;i>=b;--i)
#define mem(a,b) memset(a,b,sizeof(a))
#define fo(i,a) for(int i=0;i<a;++i)
#define il inline
const int inf=0x3f3f3f3f,N=1010;
int n,a[N],suf[N],co[N],tot;
bool g[N][N];
char ans[N*2];
bool dfs(int u,int c){
co[u]=c;
go(i,1,n){
if(!g[u][i]) continue;
if(co[i]==c) return 0;
if(!co[i]&&!dfs(i,3-c)) return 0;
}
return 1;
}
void solve(){
stack<int>s1,s2;
int now=1;
go(i,1,n){
if(co[i]==1){
s1.push(a[i]);
ans[++tot]='a';
}
else{
s2.push(a[i]);
ans[++tot]='c';
}
while(1){
if(!s1.empty()&&s1.top()==now) s1.pop(),ans[++tot]='b',++now;
else if(!s2.empty()&&s2.top()==now) s2.pop(),ans[++tot]='d',++now;
else break;
}
}
go(i,1,tot)
if(ans[i]=='a'&&ans[i-1]=='d')
swap(ans[i],ans[i-1]);
}
int main(){
//freopen("input.txt","r",stdin);
cin>>n;
go(i,1,n) scanf("%d",a+i);
suf[n+1]=inf;
com(i,n,1) suf[i]=min(suf[i+1],a[i]);
go(i,1,n)
go(j,i+1,n){
if(a[i]<a[j]&&suf[j+1]<a[i]) g[i][j]=g[j][i]=1;
}
go(i,1,n){
if(!co[i]&&!dfs(i,1)){
puts("0");
return 0;
}
}
solve();
go(i,1,tot) printf("%c ",ans[i]);
return 0;
}