1 条题解

  • 0
    @ 2023-3-18 17:47:44
    #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
    上传者