rt,思路就是筛合法的在10^5内的数,样例通过,求调
#include<bits/stdc++.h>
using namespace std;
const int MAXN=114514;
long long ans,all;
int c,t,n,v[20],cnt[20],maxv=0,pre[MAXN][10],fnt[10][MAXN],pl[20];
char lst[MAXN];
bool canfound[MAXN];
void dfs(int pl,int value){
canfound[value]=1;
for(int i=1;i<10;i++){
if(pre[pl][i]!=0&&value*10+lst[pl]-'0'<MAXN){
dfs(pre[pl][i],value*10+lst[pl]-'0');
}
}
}
signed main(){
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdin);
cin>>c>>t;
for(int tw=0;tw<t;tw++){ans=11451419198102233;all=0;
memset(canfound,0,sizeof(canfound));memset(pre,0,sizeof(pre));memset(fnt,0,sizeof(fnt));memset(cnt,0,sizeof(cnt));memset(pl,0,sizeof(pl));
cin>>lst;
while(lst[n]!='\0'){n++;}
//cout<<n<<endl;
for(int i=1;i<10;i++){cin>>v[i];maxv=max(maxv,v[i]);}
for(int i=0;i<n;i++){
cnt[lst[i]-'0']++;
for(int j=0;j<pl[lst[i]-'0'];j++){
pre[fnt[lst[i]-'0'][j]][lst[i]-'0']=i;
//cout<<fnt[lst[i]-'0'][j]<<' '<<lst[i]-'0'<<' '<<i<<endl;
}
pl[lst[i]-'0']=0;
if(!canfound[lst[i]-'0']){
canfound[lst[i]-'0']=1;
}
for(int j=1;j<10;j++){
fnt[j][pl[j]]=i;pl[j]++;
}
}int save=9,ls[10]={0};
for(int i=0;i<=n;i++){
if(ls[lst[i]-'0']==0){
dfs(i,0);ls[lst[i]-'0']=1;save--;
}
if(save==0){
break;
}
}
for(int i=1;i<10;i++){
all+=cnt[i]*v[i];
}
for(long long i=1;i<MAXN;i++){
long long save=all,pln=i;
if(!canfound[i]){
continue;
}
while(pln>0){
save-=v[pln%10];
pln/=10;
}
ans=min(ans,save+i);
}
cout<<ans<<endl;
}
}