| #include <bits/stdc++.h> |
| using namespace std; |
|
|
| int main() { |
| ios::sync_with_stdio(false); |
| cin.tie(nullptr); |
| |
| vector<vector<long long>> lines; |
| string s; |
| while (true) { |
| string line; |
| if (!getline(cin, line)) break; |
| |
| bool allspace = true; |
| for (char c : line) if (!isspace((unsigned char)c)) { allspace = false; break; } |
| if (allspace) continue; |
| istringstream iss(line); |
| vector<long long> v; |
| long long x; |
| while (iss >> x) v.push_back(x); |
| if (!v.empty()) lines.push_back(v); |
| } |
| if (lines.empty()) return 0; |
|
|
| auto is_perm = [&](const vector<long long>& v, int n)->bool{ |
| if ((int)v.size() != n) return false; |
| vector<int> seen(n+1, 0); |
| for (auto a : v) { |
| if (a < 1 || a > n) return false; |
| if (seen[(int)a]) return false; |
| seen[(int)a] = 1; |
| } |
| return true; |
| }; |
|
|
| int n = -1; |
| |
| if (!lines.empty()) { |
| if (lines[0][0] == 0 || lines[0][0] == 1) { |
| n = (int)lines[0].size() - 1; |
| } else { |
| n = (int)lines[0][0]; |
| } |
| } |
| if (n <= 0) { |
| |
| for (auto &ln : lines) { |
| if (!ln.empty() && ln[0] == 1) { |
| n = (int)ln.size() - 1; |
| break; |
| } |
| } |
| if (n <= 0) { |
| for (auto &ln : lines) { |
| |
| int cand_n = (int)ln.size(); |
| bool ok = true; |
| vector<int> seen(cand_n + 1, 0); |
| for (auto a : ln) { |
| if (a < 1 || a > cand_n) { ok = false; break; } |
| if (seen[(int)a]) { ok = false; break; } |
| seen[(int)a] = 1; |
| } |
| if (ok) { n = cand_n; break; } |
| } |
| } |
| } |
| if (n <= 0) return 0; |
|
|
| vector<long long> perm; |
| bool have_perm = false; |
|
|
| |
| for (auto &ln : lines) { |
| if (!ln.empty() && ln[0] == 1 && (int)ln.size() == n + 1) { |
| perm.assign(ln.begin() + 1, ln.end()); |
| have_perm = true; |
| } |
| } |
|
|
| |
| if (!have_perm) { |
| if (!lines.empty() && !(lines[0][0] == 0 || lines[0][0] == 1) && (int)lines[0].size() >= n + 1) { |
| vector<long long> cand(lines[0].begin() + 1, lines[0].begin() + 1 + n); |
| if (is_perm(cand, n)) { |
| perm = cand; have_perm = true; |
| } |
| } |
| } |
|
|
| |
| if (!have_perm) { |
| if ((int)lines.size() >= 2 && !(lines[0][0] == 0 || lines[0][0] == 1)) { |
| if (is_perm(lines[1], n)) { |
| perm = lines[1]; have_perm = true; |
| } |
| } |
| } |
|
|
| |
| if (!have_perm) { |
| for (int i = (int)lines.size() - 1; i >= 0; --i) { |
| if (!lines[i].empty() && !(lines[i][0] == 0 || lines[i][0] == 1)) { |
| if (is_perm(lines[i], n)) { |
| perm = lines[i]; have_perm = true; |
| break; |
| } |
| } |
| } |
| } |
|
|
| |
| bool has_query_lines = false; |
| for (auto &ln : lines) { |
| if (!ln.empty() && ln[0] == 0) { has_query_lines = true; break; } |
| } |
|
|
| if (has_query_lines && have_perm) { |
| |
| for (auto &ln : lines) { |
| if (!ln.empty() && ln[0] == 0) { |
| vector<long long> q; |
| if ((int)ln.size() >= n + 1) q.assign(ln.begin() + 1, ln.begin() + 1 + n); |
| else { |
| |
| q.assign(n, 0); |
| for (size_t i = 1; i < ln.size() && i <= (size_t)n; ++i) q[i-1] = ln[i]; |
| } |
| int matches = 0; |
| for (int i = 0; i < n; ++i) if (i < (int)q.size() && q[i] == perm[i]) ++matches; |
| cout << matches << "\n"; |
| } |
| } |
| return 0; |
| } |
|
|
| |
| if (have_perm) { |
| for (int i = 0; i < n; ++i) { |
| if (i) cout << ' '; |
| cout << perm[i]; |
| } |
| cout << "\n"; |
| return 0; |
| } |
|
|
| |
| return 0; |
| } |