为何只有48 /kk
查看原帖
为何只有48 /kk
556740
hzx360楼主2024/10/20 10:04

wa on #1--13

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+100;
int C,T,len; 
char s[12][N];
int v[12],pos[11],ne[N][10],cnt[11];
int cntt[11],bb[11];
void work(){
	int limit,ans=-1;
	if(len<=6){
		limit=0;
		for(int i=1;i<=len;i++) limit=limit*10+(s[T][i]-'0');
		ans=limit;
//		cout<<limit<<" sdf"<<endl;
	}
	for(int ii=1;ii<=999999;ii++){
		memset(cntt,0,sizeof(cntt));
		int x=ii,flag=0; bb[0]=0;
		while(x){
			int d=x%10; x/=10;
			cntt[d]++,bb[++bb[0]]=d;
			if(!d){flag=1;break;}
		}
		if(flag) continue;
		int now; flag=0;
		for(int i=bb[0];i>=1;i--){
			if(i==bb[0]) now=pos[bb[i]];
			else now=ne[now][bb[i]];
			if(!now){flag=1;break;} 
		}
		if(flag) continue;
		int res=0;
		for(int i=1;i<=9;i++) res+=v[i]*(cnt[i]-cntt[i]);
		ans=(ans==-1?res+ii:min(ans,res+ii)); 
	}
	cout<<ans<<endl;
	return;
}
signed main(){
	cin>>C>>T;
	while(T--){
		memset(ne,0,sizeof(ne)),memset(cnt,0,sizeof(cnt)),memset(pos,0,sizeof(pos));
		scanf("%s",s[T]+1); len=strlen(s[T]+1);
		for(int i=1;i<=9;i++) scanf("%lld",&v[i]);
		for(int i=len;i>=1;i--){
			for(int k=1;k<=9;k++) ne[i][k]=pos[s[T][i]-'0'];
			pos[s[T][i]-'0']=i;
			cnt[s[T][i]-'0']++;
		}
		work();
	}
	return 0;
}
2024/10/20 10:04
加载中...