题意:有一个老密码,新密码是老密码的一种排列(可能不变),新密码每位有一个限制数字,即该位不能使用该数字
问:新密码是多少(以abs(old-new)为第一关键字,new为第二关键字升序排列后输出第一个排列)
若无解输出-1
int A[M],B[M],n,C[M];bool ok;
bool mark[2][1<<20];
ll ans1=-1,ans2=-1;
void find_upper(int c,int x,int f,ll sum){
if(ok)return;
if(c>n){ans1=sum;ok=1;return;}
for(int i=0;i<n&&!ok;i++)
if(A[i]!=B[c]&&(x&(1<<i))==0&&(!f||A[i]>=C[c]))
dfs1(c+1,x|(1<<i),s&(A[i]==C[c]),sum*10+A[i]);
if(ans1==-1)mark[s][x];
}
void find_lowwer(int c,int x,int f,ll sum){
if(ok)return;
if(c>n){ans2=sum;ok=1;return;}
for(int i=n-1;i>=0&&!ok;i--)
if(A[i]!=B[c]&&(x&(1<<i))==0&&(!f||A[i]<=C[c]))
dfs2(c+1,x|(1<<i),s&(A[i]==C[c]),sum*10+A[i]);
if(ans2==-1)mark[s][x];
}
ll newPassword(ll old,vector<int>res){
ll x=old;
while(x)A[n++]=x%10,x/=10;
for(int i=1;i<=n;i++)C[i]=A[n-i],B[i]=res[i-1];
sort(A,A+n);
ok=0;find_upper(1,0,1,0);
memset(mark,0,sizeof(mark));
ok=0;find_lowwer(1,0,1,0);
if(ans1==-1)return ans2;
if(ans2==-1)return ans1;
if(ans1==-1||old-ans2<=ans1-old)return ans2;
return ans1;
}