CCCPaste

Untitled

#include 
#include 
#include 
using namespace std;
const int maxn = 555;
string add_two_numbers(string a, string b) {
    if(a.size() < b.size()) {
        swap(a, b);
    }
    int carry = 0;
    string res = "";
    int i = (int) a.size() - 1, j = (int) b.size() - 1;
    while(j >= 0 and i >= 0) {
        int digit_a = (int) (a[i] - '0');
        int digit_b = (int) (b[j] - '0');
        int sum = digit_a + digit_b + carry;
        if(sum < 10) {
            carry = 0;
        }
        else {
            carry = 1;
            sum -= 10;
        }
        res += (sum + '0');
        i--;
        j--;
    }
    while(i >= 0) {
        int digit_a = (int) (a[i] - '0');
        int sum = digit_a + carry;
        if(sum < 10) {
            carry = 0;
        }
        else {
            carry = 1;
            sum -= 10;
        }
        res += (sum + '0');
        i--;
    }
    if(carry == 1) {
        res += "1";
    }
    reverse(res.begin(), res.end());
    return res;
}
string multiply_two_numbers(string a, string b) {
    vector v((int) a.size() + (int) b.size(), 0);
    int sz_a = (int) a.size();
    int sz_b = (int) b.size();
    for(int i = sz_a - 1; i >= 0; i--) {
        for(int j = sz_b - 1; j >= 0; j--) {
            v[i + j + 1] += (a[i] - '0') * (b[j] - '0');
            
        }
    }
    for(int i = sz_a + sz_b - 1; i >= 0; i--) {
        if(v[i] >= 10) {
            v[i - 1] += v[i] / 10;
            v[i] %= 10;
        }
    }
    string res = "";
    int i = 0;
    while(v[i] == 0) {
        i++;
    }
    while(i < sz_a + sz_b) {
        res += (v[i] + '0');
        i++;
    }
    
    return res;
}
string power(string a, int k) {
    string res = "1";
    while(k--) {
        res = multiply_two_numbers(res, a);
    }
    return res;
}
bool compare(string a, string b) {
    if(a.size() < b.size()) {
        return true;
    }
    if(a.size() > b.size()) {
        return false;
    }
    if(a == b) {
        return true;
    }
    if(a < b) {
        return true;
    }
    return false;
}
string to_str(int number) {
    string res = "";
    while(number) {
        int digit = number % 10;
        res += (digit + '0');
        number /= 10;
    }
    reverse(res.begin(), res.end());
    return res;
}
int n, m, k, x;
string words[maxn];
int main() {
    ios_base::sync_with_stdio(false);
    cin >> n >> m >> k >> x;
    string s;
    cin >> s;
    string X = to_str(x);
    string K = to_str(k);
    for(int i = 0; i < m; i++) {
        cin >> words[i];
        sort(words[i].begin(), words[i].end());
    }
    vector pows;
    pows.push_back("1");
    string current_power = "1";
    for(int i = 0; i < m; i++) {
        current_power = multiply_two_numbers(current_power, K);
        pows.push_back(current_power);
    }
    current_power = pows[(int) pows.size() - 2];
    string tmp = "1";
    int at = 0;
    vector res;
    while(compare(add_two_numbers(tmp, current_power), X)) {
        tmp = add_two_numbers(tmp, current_power);
        at++;
    }
    res.push_back(words[0][at]);
    int idx = (int) pows.size() - 3;
    int i = 1;
    while(idx >= 0) {
        at = 0;
        while(compare(add_two_numbers(tmp, pows[idx]), X)) {
            tmp = add_two_numbers(tmp, pows[idx]);
            at++;
        }
        res.push_back(words[i][at]);
        i++;
        idx--;
    }
    int o = 0;
    for(int i = 0; i < n; i++) {
        if(s[i] == '#') {
            s[i] = res[o++];
        }
        cout << s[i];
    }
    


    return 0;
}