• <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 2050 Searching the Web 數(shù)據(jù)結(jié)構(gòu)

            這題基本上沒(méi)有算法,只用了一個(gè)字符串的hash。
            但代碼很長(zhǎng),200+行。非常榮幸的1ac了!

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

            #define MAX_LINES 2048
            #define MAX_LINE_LEN 128
            #define MAX_DOCS 128
            #define MAX_WORDS 65536
            #define MAX_WORDS_PER_LINE 128

            struct node {
                
            int doc, line;
                
            struct node *next;
            }
            ;

            char lines[MAX_LINES][MAX_LINE_LEN];
            int docs[MAX_DOCS][MAX_LINES];
            int docs_cnt;

            unsigned 
            int occur[MAX_DOCS][(MAX_WORDS + 31/ 32];
            unsigned 
            int hash[MAX_WORDS];
            struct node nodes[MAX_WORDS], *head[MAX_WORDS], *tail[MAX_WORDS];
            int nodes_cnt;

            inline unsigned 
            int strhash(char *str, int len)
            {
                unsigned 
            int h = 0;

                
            while (len--{
                    h 
            *= 31;
                    
            if (*str >= 'A' && *str <= 'Z')
                        h 
            += *str - 'A' + 'a';
                    
            else
                        h 
            += *str;
                    str
            ++;
                }


                
            return h;
            }


            inline unsigned 
            int test_bit(unsigned int *arr, int idx)
            {
                
            return arr[idx >> 5& (1 << (idx & 0x1f));
            }


            inline 
            void set_bit(unsigned int *arr, int idx)
            {
                arr[idx 
            >> 5|= 1 << (idx & 0x1f);
            }


            inline 
            int is_alpha(char ch)
            {
                
            return ch >= 'a' && ch <= 'z' || 
                       ch 
            >= 'A' && ch <= 'Z'
                       ;
            }


            inline 
            int split(char *line, char **strs, int *lens)
            {
                
            int cnt = 0;

                
            while (*line) {
                    
            while (*line && !is_alpha(*line))
                        line
            ++;
                    
            if (!*line)
                        
            break;
                    
            *strs++ = line;
                    
            for (*lens = 0; is_alpha(*line); (*lens)++)
                        line
            ++;
                    lens
            ++;
                    cnt
            ++;
                }


                
            return cnt;
            }


            inline 
            int find(unsigned int h)
            {
                
            int i = h % MAX_WORDS;

                
            while (hash[i] && hash[i] != h)
                    i 
            = (i + 1% MAX_WORDS;

                
            return i;
            }


            inline 
            void insert(char *str, int len, int doc, int line)
            {
                unsigned 
            int h = strhash(str, len);
                
            int i = find(h);
                
            struct node *= &nodes[nodes_cnt++];

                hash[i] 
            = h;
                t
            ->doc = doc;
                t
            ->line = line;
                
            if (!head[i]) 
                    head[i] 
            = t;
                
            else 
                    tail[i]
            ->next = t;
                tail[i] 
            = t;

                set_bit(occur[doc], i);
            }


            int output_cnt, last_doc;

            inline 
            void output(int doc, int line)
            {
                
            if (last_doc == -1)
                    last_doc 
            = doc;
                
            if (last_doc != doc) {
                    printf(
            "----------\n");
                    last_doc 
            = doc;
                }

                printf(
            "%s\n", lines[docs[doc][line]]);
                output_cnt
            ++;
            }


            struct node *list[MAX_LINES];

            inline 
            void mark_one(int id, int doc)
            {
                
            struct node *t;

                
            for (t = head[id]; t; t = t->next) 
                    
            if (doc == -1 || t->doc == doc)
                        list[docs[t
            ->doc][t->line]] = t;
            }


            inline 
            void dump_list()
            {
                
            int i;

                
            for (i = 0; i < MAX_LINES; i++)
                    
            if (list[i])
                        output(list[i]
            ->doc, list[i]->line);
            }


            inline 
            void search_one(int id)
            {
                memset(list, 
            0sizeof(list));
                mark_one(id, 
            -1);
                dump_list();
            }


            inline 
            void search_and(int id1, int id2)
            {
                
            int i;

                memset(list, 
            0sizeof(list));
                
            for (i = 0; i < docs_cnt; i++)
                    
            if (test_bit(occur[i], id1) && test_bit(occur[i], id2)) {
                        mark_one(id1, i);
                        mark_one(id2, i);
                    }

                dump_list();
            }


            inline 
            void search_or(int id1, int id2)
            {
                memset(list, 
            0sizeof(list));
                mark_one(id1, 
            -1);
                mark_one(id2, 
            -1);
                dump_list();
            }


            inline 
            void search_not(int id)
            {
                
            int i, j;

                
            for (i = 0; i < docs_cnt; i++
                    
            if (!test_bit(occur[i], id))
                        
            for (j = 0; docs[i][j]; j++)
                            output(i, j);
            }


            int main()
            {
                
            int i, j, k, c, n, l = 1, lens[MAX_WORDS_PER_LINE], id[8];
                
            char *strs[MAX_WORDS_PER_LINE];

                freopen(
            "e:\\in.txt""r", stdin);

                scanf(
            "%d\n"&docs_cnt);
                
            for (i = 0; i < docs_cnt; i++{
                    
            for (j = 0;
                        gets(lines[l]), strcmp(lines[l], 
            "**********");
                        j
            ++, l++
                    
            {
                        docs[i][j] 
            = l;
                        c 
            = split(lines[l], strs, lens);
                        
            for (k = 0; k < c; k++)
                            insert(strs[k], lens[k], i, j);
                    }

                }


                scanf(
            "%d\n"&n);
                
            while (n--{
                    gets(lines[l]);
                    c 
            = split(lines[l], strs, lens);
                    output_cnt 
            = 0;
                    last_doc 
            = -1;
                    
            for (i = 0; i < c; i++)
                        id[i] 
            = find(strhash(strs[i], lens[i]));
                    
            if (c == 1
                        search_one(id[
            0]);
                    
            else if (c == 2
                        search_not(id[
            1]);
                    
            else if (strs[1][0== 'A')
                        search_and(id[
            0], id[2]);
                    
            else
                        search_or(id[
            0], id[2]);
                    
            if (!output_cnt)
                        printf(
            "Sorry, I found nothing.\n");
                    printf(
            "==========\n");
                }


                
            return 0;
            }


            posted on 2010-07-23 13:24 糯米 閱讀(576) 評(píng)論(0)  編輯 收藏 引用 所屬分類: POJ

            成人妇女免费播放久久久| 66精品综合久久久久久久| 老男人久久青草av高清| 日产精品久久久一区二区| 国产精品一久久香蕉产线看| 久久精品亚洲精品国产欧美| 欧美伊人久久大香线蕉综合| 9191精品国产免费久久| 色8激情欧美成人久久综合电| 久久久久国产视频电影| 久久精品亚洲AV久久久无码| 久久久无码精品亚洲日韩蜜臀浪潮| 久久久无码精品亚洲日韩蜜臀浪潮 | 无码任你躁久久久久久| 亚洲精品无码久久久影院相关影片| 久久亚洲精精品中文字幕| 国产午夜精品理论片久久影视| 香蕉aa三级久久毛片 | 国内精品久久久久影院优| 精品熟女少妇aⅴ免费久久| 漂亮人妻被黑人久久精品| 久久精品夜色噜噜亚洲A∨| 久久久久亚洲av无码专区| 99久久香蕉国产线看观香| 久久久久久国产精品无码下载| 国产精品久久波多野结衣| 中文精品久久久久人妻不卡| 久久人人爽人人澡人人高潮AV| 久久国产一区二区| 久久99精品久久久久久hb无码| 久久国产亚洲精品| 性高湖久久久久久久久AAAAA | 伊人色综合久久天天人守人婷 | 狠狠人妻久久久久久综合| 狠狠色婷婷综合天天久久丁香| 精品国产乱码久久久久软件| 香蕉久久影院| 欧美亚洲国产精品久久久久| 久久亚洲高清综合| 久久天天躁狠狠躁夜夜2020老熟妇| 中文字幕亚洲综合久久|