zoukankan      html  css  js  c++  java
  • hdu 1277 全文检索

    题目连接

    http://acm.hdu.edu.cn/showproblem.php?pid=1277

    全文检索

    Description

    我们大家经常用google检索信息,但是检索信息的程序是很困难编写的;现在请你编写一个简单的全文检索程序。
    问题的描述是这样的:给定一个信息流文件,信息完全有数字组成,数字个数不超过60000个,但也不少于60个;再给定一个关键字集合,其中关键字个数不超过10000个,每个关键字的信息数字不超过60个,但也不少于5个;两个不同的关键字的前4个数字是不相同的;由于流文件太长,已经把它分成多行;请你编写一个程序检索出有那些关键字在文件中出现过。

    Input

    第一行是两个整数M,N;M表示数字信息的行数,N表示关键字的个数;接着是M行信息数字,然后是一个空行;再接着是N行关键字;每个关键字的形式是:[Key No. 1] 84336606737854833158。

    Output

    输出只有一行,如果检索到有关键字出现,则依次输出,但不能重复,中间有空格,形式如:Found key: [Key No. 9] [Key No. 5];如果没找到,则输出形如:No key can be found !。

    Sample Input

    20 10
    646371829920732613433350295911348731863560763634906583816269
    637943246892596447991938395877747771811648872332524287543417
    420073458038799863383943942530626367011418831418830378814827
    679789991249141417051280978492595526784382732523080941390128
    848936060512743730770176538411912533308591624872304820548423
    057714962038959390276719431970894771269272915078424294911604
    285668850536322870175463184619212279227080486085232196545993
    274120348544992476883699966392847818898765000210113407285843
    826588950728649155284642040381621412034311030525211673826615
    398392584951483398200573382259746978916038978673319211750951
    759887080899375947416778162964542298155439321112519055818097
    642777682095251801728347934613082147096788006630252328830397
    651057159088107635467760822355648170303701893489665828841446
    069075452303785944262412169703756833446978261465128188378490
    310770144518810438159567647733036073099159346768788307780542
    503526691711872185060586699672220882332373316019934540754940
    773329948050821544112511169610221737386427076709247489217919
    035158663949436676762790541915664544880091332011868983231199
    331629190771638894322709719381139120258155869538381417179544
    000361739177065479939154438487026200359760114591903421347697

    [Key No. 1] 934134543994403697353070375063
    [Key No. 2] 261985859328131064098820791211
    [Key No. 3] 306654944587896551585198958148
    [Key No. 4] 338705582224622197932744664740
    [Key No. 5] 619212279227080486085232196545
    [Key No. 6] 333721611669515948347341113196
    [Key No. 7] 558413268297940936497001402385
    [Key No. 8] 212078302886403292548019629313
    [Key No. 9] 877747771811648872332524287543
    [Key No. 10] 488616113330539801137218227609

    Sample Output

    Found key: [Key No. 9] [Key No. 5]

    字典树简单题,开始用kmp写t了%>_<%,换了字典树过了。。

     1 #include<algorithm>
     2 #include<iostream>
     3 #include<cstdlib>
     4 #include<cstring>
     5 #include<cstdio>
     6 #include<vector>
     7 using std::vector;
     8 const int Max_N = 60010;
     9 struct Node {
    10     int idx;
    11     Node *next[10];
    12     void set() {
    13         idx = 0;
    14         for (int i = 0; i < 10; i++) next[i] = NULL;
    15     }
    16 };
    17 struct Trie {
    18     int l;
    19     char text[Max_N], buf[64];
    20     Node stack[Max_N * 10], *root, *tail;
    21     inline void link(char *src) {
    22         for (int j = 0; src[j] != ''; j++) text[l++] = src[j];
    23         text[l] = '';
    24     }
    25     void init(){
    26         l = 0;
    27         tail = &stack[0];
    28         root = tail++;
    29         root->set();
    30     }
    31     inline Node *newNode() {
    32         Node *p = tail++;
    33         p->set();
    34         return p;
    35     }
    36     inline void insert(Node *x, char *src, int idx) {
    37         char *p = src;
    38         while (*p != '') {
    39             if (!x->next[*p - '0']) x->next[*p - '0'] = newNode();
    40             x = x->next[*p - '0'];
    41             p++;
    42         }
    43         x->idx = idx;
    44     }
    45     inline int query(Node *x, char *src) {
    46         char *p = src;
    47         while (*p != '') {
    48             if (x->idx) return x->idx;
    49             if (!x || !x->next[*p - '0']) return -1;
    50             x = x->next[*p - '0'];
    51             p++;
    52         }
    53         return -1;
    54     }
    55     inline void insert(char *src, int idx) {
    56         insert(root, src, idx);
    57     }
    58     inline int query(char *src) {
    59         return query(root, src);
    60     }
    61     inline  void gogo() {
    62         vector<int> res;
    63         for (int i = 0; text[i] != ''; i++) {
    64             int ret = query(text + i);
    65             if (ret != -1) res.push_back(ret);
    66         }
    67         int n = res.size();
    68         if (n) {
    69             printf("Found key: ");
    70             for (int i = 0; i < n; i++) {
    71                 printf("[Key No. %d]%c", res[i], i < n - 1 ? ' ' : '
    ');
    72             }
    73         } else {
    74             puts("No key can be found !");
    75         }
    76     }
    77 }solve;
    78 int main() {
    79 #ifdef LOCAL
    80     freopen("in.txt", "r", stdin);
    81     freopen("out.txt", "w+", stdout);
    82 #endif
    83     int n, m;
    84     char buf[64];
    85     while (~scanf("%d %d", &n, &m)) {
    86         solve.init();
    87         while (n--) {
    88             scanf("%s", buf);
    89             solve.link(buf);
    90         }
    91         getchar(); getchar();
    92         for (int i = 1; i <= m; i++) {
    93             gets(buf);
    94             solve.insert(strchr(buf, ']') + 2, i);
    95         }
    96         solve.gogo();
    97     }
    98     return 0;
    99 }
    View Code
    By: GadyPu 博客地址:http://www.cnblogs.com/GadyPu/ 转载请说明
  • 相关阅读:
    118/119. Pascal's Triangle/II
    160. Intersection of Two Linked Lists
    168. Excel Sheet Column Title
    167. Two Sum II
    172. Factorial Trailing Zeroes
    169. Majority Element
    189. Rotate Array
    202. Happy Number
    204. Count Primes
    MVC之Model元数据
  • 原文地址:https://www.cnblogs.com/GadyPu/p/4550517.html
Copyright © 2011-2022 走看看