提交时间:2024-06-23 20:47:29
运行 ID: 30354
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define END {printf("-1\n"); return 0;} const int N = 2e5 + 9; struct node { int v, id; }; vector<node> G[N]; int n, m, b, len[N], cnts[N], cnte[N], ind[N], oud[N], cur[N]; vector<char> s[N]; char rd[N]; stack<int> ans; void dfs(int u) { for (int i = cur[u]; i < G[u].size(); i = cur[u]) { cur[u]++; int v = G[u][i].v, id = G[u][i].id; dfs(v), ans.push(id); } } signed main() { scanf("%d%d%d", &n, &m, &b); for (int i = 1; i <= n; i++) { scanf("%s", rd); len[i] = strlen(rd); for (int j = 0; j < len[i]; j++) { s[i].push_back(rd[j]); } } for (int i = 1; i <= n; i++) { int p = 0; while (s[i][p] == '0') p++; p %= m, cnts[i] = p; while (p < len[i]) { if (s[i][p] == '0') END; p += m; } p -= m, cnte[i] = len[i] - p - 1, oud[cnts[i]]++, ind[m - cnte[i] - 1]++; G[cnts[i]].push_back({m - cnte[i] - 1, i}); } int st = -1, ed = -1; for (int i = 0; i < m; i++) { if (ind[i] == oud[i]) continue; else if (abs(ind[i] - oud[i]) >= 2) END else if (oud[i] > ind[i]) { if (st != -1) END st = i; } else { if (ed != -1) END ed = i; } } if (st != b) { if (st == -1) st = b; else END } for (int i = 0; i < m; i++) { sort(G[i].begin(), G[i].end(), [&](node x, node y) {return x.id < y.id;}); } dfs(st); while (!ans.empty()) printf("%d ", ans.top()), ans.pop(); return 0; }