class Solution {
public:
int m;
int dp(int digit[],int cnt[],int num,int offset,int len){
if(len==0) return 1;
int ans=0;
int cur=(num/offset)%10;
for(int i=0;i<m;i++){
int p=digit[i];
if(p<cur) ans+=cnt[len-1];
else if(p==cur) ans+=dp(digit,cnt,num,offset/10,len-1);
else break;
}
return ans;
}
int atMostNGivenDigitSet(vector<string>& digits, int n) {
int tmp=n/10;
int len=1;
int offset=1;
while(tmp){
tmp/=10;
offset*=10;
len++;
}
m=digits.size();
int digit[15];
for(int i=0;i<m;i++){
digit[i]=digits[i][0]^48;
}
int cnt[15];
cnt[0]=1;
int ans=0;
for(int i=1,s=m;i<len;i++,s*=m) cnt[i]=s,ans+=s;
return ans+dp(digit,cnt,n,offset,len);
}
};