zoukankan      html  css  js  c++  java
  • 【HDOJ】2279 File Search Tool

    显然适用字典树建树,串长和模式串都很小,所以直接递归搜索。同时,适用bk标记当前的查询次数(排除不同模式的多次查询成功,如*t*)。需要主要的是,居然存在同名文件!!!。

      1 /* 2279 */
      2 #include <iostream>
      3 #include <string>
      4 #include <map>
      5 #include <queue>
      6 #include <set>
      7 #include <stack>
      8 #include <vector>
      9 #include <deque>
     10 #include <algorithm>
     11 #include <cstdio>
     12 #include <cmath>
     13 #include <ctime>
     14 #include <cstring>
     15 #include <climits>
     16 #include <cctype>
     17 #include <cassert>
     18 #include <functional>
     19 using namespace std;
     20 
     21 #define rep(i, a, n)     for (int i=a;i<n;++i)
     22 #define per(i, a, n)     for (int i=n-1;i>=a;--i)
     23 #define pb                 push_back
     24 #define mp                 make_pair
     25 #define all(x)             (x).begin(),(x).end()
     26 #define SZ(x)             ((int)(x).size())
     27 #define lson            l, mid, rt<<1
     28 #define rson            mid+1, r, rt<<1|1
     29 
     30 typedef struct node_t {
     31     int in;
     32     int c;
     33     int next[26];
     34 } node_t;
     35 
     36 const int maxl = 21;
     37 const int maxn = 10001;
     38 node_t nd[maxn*maxl];
     39 char s[maxl], d[maxl];
     40 int dl, sl;
     41 int L = maxn*maxl, bk;
     42 int n, m, ans;
     43 
     44 void init() {
     45     memset(nd, 0, sizeof(node_t)*L);
     46     L = bk = 1;
     47 }
     48 
     49 void insert() {
     50     int i = 0, id;
     51     int p = 0, q;
     52     
     53     while (s[i]) {
     54         id = s[i] - 'a';
     55         q = nd[p].next[id];
     56         if (q == 0)
     57             q = nd[p].next[id] = L++;
     58         p = q;
     59         ++i;
     60     }
     61     ++nd[p].c;
     62 }
     63 
     64 void search(int p, int l) {
     65     if (l == dl) {
     66         if (nd[p].c && nd[p].in!=bk) {
     67             ans += nd[p].c;
     68             nd[p].in = bk;
     69         }
     70         return ;
     71     }
     72     
     73     if (d[l] == '?') {
     74         for (int i=0; i<26; ++i)
     75             if (nd[p].next[i])
     76                 search(nd[p].next[i], l+1);
     77             
     78     } else if (d[l] == '*') {
     79         search(p, l+1);
     80         for (int i=0; i<26; ++i)
     81             if (nd[p].next[i])
     82                 search(nd[p].next[i], l);
     83             
     84     } else {
     85         int id = d[l] - 'a';
     86         if (nd[p].next[id])
     87             search(nd[p].next[id], l+1);
     88         
     89     }
     90 }
     91 
     92 void handle() {
     93     int i = 0;
     94     
     95     sl = strlen(s);
     96     dl = 0;
     97     while (1) {
     98         while (s[i]=='*'&&s[i+1]=='*')
     99             ++i;
    100         if (i >= sl)
    101             break;
    102         d[dl++] = s[i++];
    103     }
    104     d[dl] = '';
    105 }
    106 
    107 int main() {
    108     int i, j, k;
    109     
    110     #ifndef ONLINE_JUDGE
    111         freopen("data.in", "r", stdin);
    112         freopen("data.out", "w", stdout);
    113     #endif
    114     
    115     while (scanf("%d %d",&n,&m)!=EOF) {
    116         init();
    117         for (i=0; i<n; ++i) {
    118             scanf("%s", s);
    119             insert();
    120         }
    121         while (m--) {
    122             scanf("%s", s);
    123             handle();
    124             ans = 0;
    125             search(0, 0);
    126             ++bk;
    127             if (ans)
    128                 printf("%d
    ", ans);
    129             else
    130                 puts("Not match");
    131         }
    132     }
    133     
    134     #ifndef ONLINE_JUDGE
    135         printf("time = %d.
    ", (int)clock());
    136     #endif
    137     
    138     return 0;
    139 }
  • 相关阅读:
    c#基础之Type
    .Net IOC框架入门之三 Autofac
    EF的三种数据加载方式
    EntityFramework扩展之第三方类库
    EF Codefirst入门之创建数据库
    EasyUI combotree的使用
    MacOS 安装 gdb 踩过的坑
    enex 转 md 格式的几种方式(免费版/氪金版)
    C++ 标准库之 iomanip 、操作符 ios::fixed 以及 setprecision 使用的惨痛教训经验总结
    python list 中 remove 的骚操作/易错点
  • 原文地址:https://www.cnblogs.com/bombe1013/p/4507102.html
Copyright © 2011-2022 走看看