POJ-2513 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;
}
posted @ 2012-07-12 15:00  沐阳  阅读(229)  评论(0编辑  收藏  举报