• <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, 評論 - 47, 引用 - 0
            數據加載中……

            POJ 2050 Searching the Web 數據結構

            這題基本上沒有算法,只用了一個字符串的hash。
            但代碼很長,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 糯米 閱讀(572) 評論(0)  編輯 收藏 引用 所屬分類: POJ

            国产精品熟女福利久久AV | 国产精品久久免费| 久久久久中文字幕| 思思久久精品在热线热| 亚洲成人精品久久| 狠狠色婷婷久久综合频道日韩 | 久久影院久久香蕉国产线看观看| 亚洲午夜久久久| 91久久国产视频| 99精品久久精品一区二区| 亚洲一区中文字幕久久| 精品久久久无码21p发布 | 久久er99热精品一区二区| 日本精品久久久久久久久免费| 久久夜色精品国产欧美乱| 久久久久亚洲AV无码专区桃色 | 亚洲国产成人久久综合一区77| 国内精品久久久久久99蜜桃 | 日本久久中文字幕| 久久99精品国产99久久6男男| 久久人人爽人人爽人人片AV不 | 亚洲国产美女精品久久久久∴ | 久久久久99精品成人片欧美| 久久免费99精品国产自在现线| 97r久久精品国产99国产精| 国产成年无码久久久免费| 久久伊人影视| 亚洲国产精品狼友中文久久久| 久久免费美女视频| 青青青青久久精品国产| 91久久婷婷国产综合精品青草| 亚洲午夜久久久久久久久电影网| 人妻系列无码专区久久五月天| 久久久久人妻一区精品| 久久99亚洲综合精品首页| 国产精品成人精品久久久| 狠色狠色狠狠色综合久久| 99久久精品费精品国产一区二区| 久久久久久夜精品精品免费啦| 欧美噜噜久久久XXX| 国产91色综合久久免费|