rt,现在 sub1 WA 了 #7 和 #10,sub4 最后两个点超时了,求 hack(最好能给出代码修改方法)以及卡常。
做法应该是对的。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<int,ll> pil;
#define fi first
#define se second
#define endl '\n'
#define mp make_pair
#define pb push_back
#define all(x) x.begin(),x.end()
#define Cl(x) memset(x,0,sizeof(x))
const bool DC=0;
const ll mod=0;
const int N=100005;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll qpow(ll a,ll b,ll p=mod){ll ans=1;for(;b;b>>=1,a=a*a%p)if(b&1)ans=ans*a%p;return ans;}
void NO(){cout<<"NO\n";}
void YES(){cout<<"YES\n";}
mt19937 rnd((unsigned long long)new char);
bitset<10>emp;
int mnl=16;
string calc(string last,vector<bitset<10>>need){
// cerr<<last<<" "<<need.size()<<"\n";
if(last.size()>mnl)return "#";
if(need.size()<=1){
if(need.size()==0){
while(last[0]=='0')last.erase(last.begin(),last.begin()+1);
mnl=min(mnl,(int)last.size());
return last;
}
if(!need[0].count()){
while(last[0]=='0')last.erase(last.begin(),last.begin()+1);
return mnl=min(mnl,(int)last.size()),last;
}
string ans;
if(need[0].count()&&need[0][0]){
auto it=need[0]._Find_next(0);
if(it==10){
ans+="10";
}else ans+=char(it+48),ans+="0";
for(it=need[0]._Find_next(it);it<10;it=need[0]._Find_next(it))ans+=char(it+48);
}else for(int i=0;i<10;i++)if(need[0][i])ans+=char(i+48);
if((ans+last)[0]=='0')return mnl=min(mnl,(int)("1"+ans+last).size()),"1"+ans+last;
return mnl=min(mnl,(int)(ans+last).size()),ans+last;
}
vector<bitset<10>>tmp;
string ans="#";
for(int cur=0;cur<=9;cur++){
tmp.clear();
for(int now=cur;now<=cur+need.size()-1;now++){
if(tmp.size()==now/10)tmp.push_back(emp);
bool f=0;
if(need[now-cur][now%10])need[now-cur][now%10]=0,f=1;
tmp[now/10]|=need[now-cur];
if(f)need[now-cur][now%10]=1;
}
// cerr<<"test "<<cur<<"\n";
while(tmp.size()&&tmp.back()==emp)tmp.pop_back();
string nxt="";nxt+=char(cur+48),nxt+=last;
// cerr<<"TEST "<<nxt<<" "<<tmp.size()<<"\n";
string qwq=calc(nxt,tmp);
if(qwq=="#")continue;
if(ans=="#")ans=qwq;
else if(ans.size()>qwq.size())ans=qwq;
else if(ans.size()==qwq.size()&&ans>qwq)ans=qwq;
if(last=="")mnl=min(mnl,(int)ans.size());
}
return ans;
}
void __INIT__(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);}
void __SOLVE__(int _case){
int k,a;
cin>>k;
vector<bitset<10>>tmp(k);
bool t=0;
for(int i=0;i<k;i++){
cin>>a;
t|=a;
tmp[i][a]=1;
}
cout<<calc("",tmp)<<"\n";
}
int main(){/*freopen(".in","r",stdin);freopen(".out","w",stdout);*/__INIT__();int T;DC?cin>>T,1:T=1;for(int _CASE=1;_CASE<=T;_CASE++)__SOLVE__(_CASE);return 0;}