zoukankan      html  css  js  c++  java
  • POJ 2513 Colored Sticks

    POJ_2513

        这个题目实际上要求木棍能够组成一个欧拉道路即可。为了练字典树所以用字典树写的,当然,这个题目用哈希做也可以。

        需要注意的是由于木棍有25W,因此不同的顶点最多有50W,所以存储图顶点的数组要开到50W。

    #include<stdio.h>
    #include<string.h>
    #define MAXN 500010
    #define MAXD 1000010
    #define D 500000
    int next[MAXD][26], flag[MAXD], r[MAXD], num[MAXN], p[MAXN], e, n;
    char b[15];
    void insert(int cur, int k)
    {
    ++ e;
    flag[e] = 0;
    memset(next[e], 0, sizeof(next[e]));
    next[cur][k] = e;
    }
    int solve()
    {
    int i, k, cur;
    cur = 0;
    for(i = 0; b[i]; i ++)
    {
    k = b[i] - 'a';
    if(!next[cur][k])
    insert(cur, k);
    cur = next[cur][k];
    }
    if(flag[cur])
    ++ num[r[cur]];
    else
    {
    flag[cur] = 1;
    r[cur] = ++ n;
    num[n] = 1;
    }
    return r[cur];
    }
    int find(int x)
    {
    return p[x] == x ? x : (p[x] = find(p[x]));
    }
    int check()
    {
    int i, k = 0;
    for(i = 1; i <= n; i ++)
    {
    if(find(i) != find(1))
    return 0;
    if(num[i] % 2)
    ++ k;
    }
    if(k > 2)
    return 0;
    else
    return 1;
    }
    void init()
    {
    int i, j, k, cur, x, y, tx, ty;
    for(i = 0; i < D; i ++)
    p[i] = i;
    memset(num, 0, sizeof(num));
    e = n = 0;
    while(scanf("%s", b) == 1)
    {
    x = solve();
    scanf("%s", b);
    y = solve();
    tx = find(x), ty = find(y);
    if(tx != ty)
    p[tx] = ty;
    }
    if(check())
    printf("Possible\n");
    else
    printf("Impossible\n");
    }
    int main()
    {
    init();
    return 0;
    }


  • 相关阅读:
    快速排序
    优先队列
    堆排序
    树、二叉树基础
    分治法
    递归算法详细分析
    算法基础
    Linux文件系统详解
    fs/ext2/inode.c相关函数注释
    块设备的读流程分析
  • 原文地址:https://www.cnblogs.com/staginner/p/2320989.html
Copyright © 2011-2022 走看看