zoukankan      html  css  js  c++  java
  • 【POJ】1816 Wild Words

    DFS+字典树。题目数据很BT。注意控制DFS深度小于等于len。当''时,还需判断末尾*。另外,当遇到*时,注意讨论情况。

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstring>
      4 #include <cstdlib>
      5 #include <vector>
      6 #include <algorithm>
      7 using namespace std;
      8 
      9 #define TRIEN 28
     10 
     11 typedef struct Trie {
     12     vector<int> vc;
     13     Trie *next[TRIEN];
     14     Trie() {
     15         for (int i=0; i<TRIEN; ++i)
     16             next[i] = NULL;
     17     }
     18 } Trie;
     19 
     20 Trie root;
     21 char buf[25];
     22 int nums[100005], nn, len;
     23 
     24 void create(char str[], int in) {
     25     int i = 0, id;
     26     Trie *p = &root, *q;
     27 
     28     while (str[i]) {
     29         if (str[i] == '?')
     30             id = 26;
     31         else if (str[i] == '*')
     32             id = 27;
     33         else
     34             id = str[i] - 'a';
     35         ++i;
     36         if (p->next[id] == NULL) {
     37             q = new Trie();
     38             p->next[id] = q;
     39         }
     40         p = p->next[id];
     41     }
     42     p->vc.push_back(in);
     43 }
     44 
     45 void find(Trie *p, int d, int f) {
     46     int id;
     47     if (d > len)
     48         return ;
     49     if (buf[d] == '') {
     50         int vcn = p->vc.size();
     51         int i;
     52         if (vcn) {
     53             for (i=0; i<vcn; ++i)
     54                 nums[nn++] = p->vc[i];
     55         }
     56         if (p->next[27])
     57             find(p->next[27], d, 0);
     58         return ;
     59     }
     60 
     61     id = buf[d] - 'a';
     62     if (p->next[id])
     63         find(p->next[id], d+1, 0);
     64     if (p->next[26])
     65         find(p->next[26], d+1, 0);
     66     if (p->next[27]) {
     67         find(p->next[27], d+1, 1);
     68         find(p->next[27], d, 1);
     69     }
     70     if (f)
     71         find(p, d+1, 1);
     72 }
     73 
     74 int main() {
     75     int n, m, i;
     76 
     77     scanf("%d %d", &n, &m);
     78 
     79     for (i=0; i<n; ++i) {
     80         scanf("%s", buf);
     81         create(buf, i);
     82     }
     83 
     84     while (m--) {
     85         scanf("%s", buf);
     86         nn = 0;
     87         len = strlen(buf);
     88         find(&root, 0, 0);
     89         if (!nn) {
     90             printf("Not match
    ");
     91             continue;
     92         }
     93         sort(nums, nums+nn);
     94         printf("%d", nums[0]);
     95         for (i=1; i<nn; ++i)
     96             if (nums[i] != nums[i-1])
     97                 printf(" %d", nums[i]);
     98         printf("
    ");
     99     }
    100 
    101     return 0;
    102 }
  • 相关阅读:
    踏实每一个脚印——2019年12月复盘
    修改博客园markdown编辑器代码高亮风格的方法
    Hyperion: Building the Largest In memory Search Tree
    C++11——智能指针
    拷贝控制
    分布式系统常见概念
    extern和static使用
    APUE—UNIX文件系统
    C++的一些细节
    fork和僵尸进程
  • 原文地址:https://www.cnblogs.com/bombe1013/p/3813245.html
Copyright © 2011-2022 走看看