• POJ2513 Colored Sticks 字典树,欧拉回路


    这题用map就超时了,所以用字典树来优化,第一次写静态的,现在都不习惯用指针了。

    由于这里不要回到源点,所以不许要所有点的度都为偶数,零个或者两个均可,图也必须是连通的。

    代码如下:

    #include <cstring>
    #include <cstdlib>
    #include <cstdio>
    #include <string>
    using namespace std;
    
    char s1[15], s2[15];
    int idx = 0, flag = 0, ptr = 1;
    
    int set[2500005];
    
    struct Node
    {
        int cnt, No;
        int ch[26];
    }e[1250005];
    
    int find(int x)
    {
        return set[x] = x == set[x] ? x : find(set[x]);
    }
    
    int insert(int p, char *in)
    {
        if (*in == '\0') {
            if (e[p].cnt == 0) {
                e[p].No = ptr++;
            }
            ++e[p].cnt;
            if (e[p].cnt & 1) {
                ++flag;
            }
            else {
                --flag;
            }
            return find(e[p].No);
        }
        else {
            if (e[p].ch[*in-'a'] == 0) {
                ++idx;
                e[p].ch[*in-'a'] = idx;
            }
            insert(e[p].ch[*in-'a'], in+1);
        }
    }
    
    int main()
    {
        int x, y, root = 0;
        for (int i = 0; i <= 2500000; ++i) {
            set[i] = i;
        }
        while (scanf("%s %s", s1, s2) == 2) {
            x = insert(0, s1);
            y = insert(0, s2);
            if (x != y) {
                set[x] = y;
            }
        }
        for (int i = 1; i < ptr; ++i) {
            if (set[i] == i) {
                ++root;
            }
        }
        if (ptr == 1 || (flag == 0 || flag == 2) && root == 1) {
            puts("Possible");
        }
        else {
            puts("Impossible");
        }
        return 0;
    }
  • 相关阅读:
    Ceph相关
    Redis学习
    docker mysql
    WebSocket学习与使用
    nginx学习与使用
    python学习小记
    基数计数——HyperLogLog
    Swagger使用小记
    理解Java枚举类型
    Jenkins使用
  • 原文地址:https://www.cnblogs.com/Lyush/p/2588133.html
Copyright © 2020-2023  润新知