Editorial for Blurbish
Submitting an official solution before solving the problem yourself is a bannable offence.
Türkçe
Her bir sayının Blurbish'te bir karşılığı olup olmadığını kısa bir zamanda anlayabiliriz (sayının basamak sayısı (\(K\)) ile orantılı bir sürede, ki bu da en fazla 6 olabilir). Çözüm olarak Blurbish olarak verilen sayı ile aynı basamak sayısına sahip olan sayıların hepsini deneyip en küçük olanı bulabiliriz. Bu her bir sayı için toplamda \(O(N)\) zaman, tüm sayılar için de \(O(N \cdot 10^K)\) zaman alacaktır.
Eğer çözümü biraz hızlandırmak istersek, sayıları ararken sadece bize verilen asal sayıların çarpımlarına bakabiliriz. (\(A \cdot B \cdot C\))
English
We can test if each number can correspond to a Blurbish number in a very short time (proportional to the number of digits (\(K\)) which is at most 6). So we can test all of the numbers with the same digits as the given Blurbish number and find the smallest one. This would take \(O(10^K)\) time. In total, the problem would take \(O(N \cdot 10^K)\) time.
If we would want to improve the time we could basically only check the numbers which are multiples of the given prime numbers, \(A \cdot B \cdot C\).
#include <bits/stdc++.h>
using namespace std;
int arr[100005];
int n, m, k, l, a, b, c;
string s[100005];
int test(int number, string s){
map<char, int> ma;
int it = s.length();
for(int i=0;i<10;i++){
ma['a'+i]=-1;
}
while(it-->=0){
char c = s[it];
int digit = number%10;
number/=10;
if(ma[c]==-1 || ma[c]==digit) ma[c]=digit;
else return 0;
}
return 1;
}
int main(){
ios_base::sync_with_stdio(false); cin.tie(NULL);
cin>>a>>b>>c;
k=a*b*c;
cin>>n;
for(int i=0;i<n;i++){
cin>>s[i];
}
for(int i=0;i<n;i++){
l = s[i].length();
int lim1=pow(10, l-1), lim2=pow(10, l)-1;
int it=k, f=-1;
while(it<=lim2){
if(it>=lim1 && test(it, s[i])){
f=it;
break;
}
it+=k;
}
cout<<f<<'\n';
}
}