• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            糯米

            TI DaVinci, gstreamer, ffmpeg
            隨筆 - 167, 文章 - 0, 評(píng)論 - 47, 引用 - 0
            數(shù)據(jù)加載中……

            POJ 3121 The SetStack Computer 哈希

            可以開一個(gè)閉hash表。棧里面存放的只是hash表的下標(biāo)。這樣比較兩個(gè)set是否一樣,就只需要比較他們的下標(biāo)是否一樣。
            同時(shí)對(duì)每個(gè)set,要保存它的孩子,一樣存放的是hash表的下標(biāo)。

            union和intersect操作,如果是按序存放孩子的話,復(fù)雜度可以低至O(N)。
            空間復(fù)雜度為O(N^2)。

            #include <stdio.h>
            #include 
            <string.h>
            #include 
            <algorithm>
            #include 
            <cmath>

            using namespace std;

            #define SIZE 4096
            struct slot {
                
            int *arr;
                
            int cnt;
                
            int hash;
            }
             table[SIZE];
            int stack[SIZE], *sp;
            int _pool[SIZE*1024], *pool;

            int gethash(int *arr, int cnt)
            {
                unsigned 
            int h = 0x1653;
                
            while (cnt--
                    h 
            = (h*31 + *arr++& 0x7fffffff;
                
            return h;
            }


            int insert(int *arr, int cnt)
            {
                
            int h = gethash(arr, cnt);
                
            int i = h%SIZE;
                
            while (table[i].hash && table[i].hash != h)
                    i 
            = (i+1)%SIZE;
                
            if (!table[i].hash) {
                    memcpy(pool, arr, cnt
            *sizeof(int));
                    table[i].hash 
            = h;
                    table[i].arr 
            = pool;
                    table[i].cnt 
            = cnt;
                    pool 
            += cnt;
                }

                
            return i;
            }


            void set_union(int *a, int ca, int *b, int cb, int *arr, int *cnt)
            {
                
            int i, j;

                memcpy(arr, a, ca
            *sizeof(int));
                memcpy(arr 
            + ca, b, cb*sizeof(int));
                sort(arr, arr 
            + ca + cb);
                
            for (i = j = 0; i < ca + cb; i++{
                    
            if (i && arr[i] == arr[i-1])
                        
            continue;
                    arr[j
            ++= arr[i];
                }

                
            *cnt = j;
            }


            int do_union(int a, int b)
            {
                
            int arr[SIZE], cnt;

                set_union(
                        table[a].arr, table[a].cnt, 
                        table[b].arr, table[b].cnt, 
                        arr, 
            &cnt
                        );
                
            return insert(arr, cnt);
            }


            int do_intersect(int a, int b)
            {
                
            int arr[SIZE], cnt, i, j;

                cnt 
            = 0;
                
            for (i = 0; i < table[a].cnt; i++{
                    
            for (j = 0; j < table[b].cnt; j++)
                        
            if (table[b].arr[j] == table[a].arr[i]) {
                            arr[cnt
            ++= table[a].arr[i];
                            
            break;
                        }

                }

                
            return insert(arr, cnt);
            }


            int do_add(int a, int b)
            {
                
            int arr[SIZE], cnt;

                set_union(table[b].arr, table[b].cnt, 
            &a, 1, arr, &cnt);
                
            return insert(arr, cnt);
            }


            int main()
            {
                
            char op[128];
                
            int t, i, n;

                scanf(
            "%d"&t);
                
            while (t--{
                    pool 
            = _pool;
                    sp 
            = stack-1;
                    
            for (i = 0; i < SIZE; i++)
                        table[i].hash 
            = 0;
                    scanf(
            "%d"&n);
                    
            while (n--{
                        scanf(
            "%s", op);
                        
            if (!strcmp(op, "PUSH")) {
                            
            *++sp = insert(NULL, 0);
                        }
             else if (!strcmp(op, "DUP")) {
                            sp[
            1= *sp;
                            sp
            ++;
                        }
             else if (!strcmp(op, "UNION")) {
                            sp[
            -1= do_union(sp[0], sp[-1]);
                            sp
            --;
                        }
             else if (!strcmp(op, "INTERSECT")) {
                            sp[
            -1= do_intersect(sp[0], sp[-1]);
                            sp
            --;
                        }
             else if (!strcmp(op, "ADD")) {
                            sp[
            -1= do_add(sp[0], sp[-1]);
                            sp
            --;
                        }

                        printf(
            "%d\n", table[*sp].cnt);
                    }

                    printf(
            "***\n");
                }


                
            return 0;
            }

            posted on 2011-02-23 14:41 糯米 閱讀(735) 評(píng)論(1)  編輯 收藏 引用 所屬分類: POJ

            評(píng)論

            # re: POJ 3121 The SetStack Computer 哈希  回復(fù)  更多評(píng)論   

            請(qǐng)問這個(gè)題 你還記得怎么對(duì) 集合 做的hash 嗎?? 搞不懂。。
            2013-03-20 22:12 | OceanLight
            国产69精品久久久久99尤物 | 久久久无码精品亚洲日韩软件| 亚洲国产另类久久久精品| 麻豆AV一区二区三区久久| 久久精品国产91久久综合麻豆自制| 国产精品美女久久久免费| 久久久噜噜噜久久中文字幕色伊伊| 久久久久亚洲AV无码麻豆| 99久久免费国产精品| 77777亚洲午夜久久多喷| 亚洲伊人久久大香线蕉苏妲己| 亚洲欧美日韩久久精品| 亚洲精品国产成人99久久| 亚洲国产精品高清久久久| 久久丝袜精品中文字幕| 99久久99这里只有免费的精品| 国产精品久久久久久久久久影院 | 99久久人人爽亚洲精品美女| 久久人人爽人人爽人人片AV东京热 | 精品久久久久久99人妻| 精品久久久久中文字幕日本| 中文字幕无码精品亚洲资源网久久| 久久国产精品一区| 91精品国产91久久久久久| 国产精品久久久久久| 国产成人精品免费久久久久| 午夜精品久久久久久久久| 超级碰碰碰碰97久久久久| 亚洲午夜精品久久久久久浪潮 | 一级女性全黄久久生活片免费| 青青青国产精品国产精品久久久久| 亚洲国产精品久久久天堂 | 欧美日韩中文字幕久久伊人| 久久99精品久久久久婷婷| 亚洲国产精品久久久天堂| 无码精品久久久天天影视| 久久精品天天中文字幕人妻| 久久精品国产亚洲AV电影| 69久久夜色精品国产69| 久久精品国产免费一区| 成人精品一区二区久久|