Editorial for Blurbish


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.

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';
    }

}