#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, m, k;
char a[35][35];
vector<string> pwuiz[1001];
vector<string> all1, all2;
void dfs1(int x, int y, string c) {
    if(x == 1 && y == 1) {
        string w = c;
        reverse(w.begin(), w.end());
        all1.push_back(w);
        return;
    }
    if(x - 1) {
        dfs1(x - 1, y, c + a[x - 1][y]);
    }
    if(y - 1) {
        dfs1(x, y - 1, c + a[x][y - 1]);
    }
}
void dfs2(int x, int y, string c) {
    if(x == n && y == m) {
        all2.push_back(c);
        return;
    }
    if(x + 1 <= n) {
        dfs2(x + 1, y, c + a[x + 1][y]);
    }
    if(y + 1 <= m) {
        dfs2(x, y + 1, c + a[x][y + 1]);
    }
}
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> m;
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= m; j++) {
            cin >> a[i][j];
        }
    }
    cin >> k;
    vector<pair<string, int>> left;
    vector<pair<string, int>> right;
    for(int i = 1; i <= n; i++) {
        int j = m / 2;
        string u = "";
        u += a[i][j];
        dfs1(i, j, u);
        for(auto it : all1) {
            left.push_back({it, i});
        }
        u = "";
        u = a[i][j + 1];
        dfs2(i, j + 1, u);
        for(auto it : all2) {
            right.push_back({it, i});
        }
        all1.clear();
        all2.clear();
    }
    sort(left.begin(), left.end());
    sort(right.begin(), right.end());
    for(auto it : right) {
        pwuiz[it.second].push_back(it.first);
    }
    for(int i = 1; i <= n; i++) {
        sort(pwuiz[i].begin(), pwuiz[i].end());
    }
    int current = 0;
    for(auto it : left) {
        current += pwuiz[it.second].size();
        if(current >= k) {
            current -= pwuiz[it.second].size();
            cout << it.first << pwuiz[it.second][current - k + 1];
            break;
        }
    }
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |