1 条题解
-
0
#include <bits/stdc++.h> using namespace std; int n; string s; const int MAXN = 5005; struct Trie { int tot = 0; int e[MAXN][2]; bool ok[MAXN]; void insert(const string &s) { int u = 0; for (int i = 0; i < s.length(); i++) { if (e[u][s[i] - '0'] == 0) e[u][s[i] - '0'] = ++tot; u = e[u][s[i] - '0']; } ok[u] = true; } } trie; int ans = -1; const int MAXF = 0x3f3f3f3f; int f[MAXN][MAXN]; queue<pair<int, int>> q; void bfs() { memset(f, 0x3f, sizeof(f)); q.push(make_pair(0, 0)); f[0][0] = 0; while (!q.empty()) { int x = q.front().first, y = q.front().second; q.pop(); if (trie.ok[x] && trie.ok[y] && x != y) { if (ans == -1) ans = f[x][y]; else ans = min(ans, f[x][y]); } if (trie.e[x][0] && trie.e[y][0]) { int nx = trie.e[x][0], ny = trie.e[y][0]; if (f[nx][ny] == MAXF) { f[nx][ny] = f[x][y] + 1; q.push(make_pair(nx, ny)); } if (trie.ok[nx] && f[0][ny] == MAXF) { f[0][ny] = f[x][y] + 1; q.push(make_pair(0, ny)); } if (trie.ok[ny] && f[nx][0] == MAXF) { f[nx][0] = f[x][y] + 1; q.push(make_pair(nx, 0)); } } if (trie.e[x][1] && trie.e[y][1]) { int nx = trie.e[x][1], ny = trie.e[y][1]; if (f[nx][ny] == MAXF) { f[nx][ny] = f[x][y] + 1; q.push(make_pair(nx, ny)); } if (trie.ok[nx] && f[0][ny] == MAXF) { f[0][ny] = f[x][y] + 1; q.push(make_pair(0, ny)); } if (trie.ok[ny] && f[nx][0] == MAXF) { f[nx][0] = f[x][y] + 1; q.push(make_pair(nx, 0)); } } } } int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n; for (int i = 1; i <= n; i++) { cin >> s; trie.insert(s); } bfs(); cout << ans << endl; return 0; }
- 1
信息
- ID
- 1244
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 7
- 标签
- 递交数
- 15
- 已通过
- 8
- 上传者