#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... |