zoukankan      html  css  js  c++  java
  • hdu 1277Trie树

    这题本来以为得DFA的,仔细审题以后发现,题目说每个关键字前4个字母不同(这意味着每个关键字结束的节点都是不同的),而且长度不超过60,马上醒悟,只要用所有的关键字建一棵Trie树,然后把主串跑一遍就可以了,复杂度为主串长度*60,肯定能过啊。。。

    /*
     * hdu1277/win.cpp
     * Created on: 2012-11-6
     * Author    : ben
     */
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cmath>
    #include <ctime>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <set>
    #include <map>
    #include <stack>
    #include <string>
    #include <vector>
    #include <deque>
    #include <list>
    #include <functional>
    #include <numeric>
    #include <cctype>
    using namespace std;
    const int child_num = 10;
    const int MAXM = 60100;
    const int MAXN = 10100;
    char str[MAXM];
    bool flags[MAXN];
    const char base = '0';
    typedef struct TrieNode {
        //子节点指针
        struct TrieNode *child[child_num];
        int num;
    }TrieNode;
    const int MAX_NODE_NUM = 300000;
    TrieNode mymemory[MAX_NODE_NUM];
    int cur_node_num = 0;
    vector<int> ans;
    inline TrieNode* newTrieNode() {
        //如需动态分配内存,则下句可改为TrieNode* node = new TrieNode();
        TrieNode* node = &mymemory[cur_node_num++];
        //初始化
        node->num = 0;
        memset(node->child, 0, sizeof(node->child));
        return node;
    }
    void insert_to_trie(TrieNode *root, const char *s, const int len, int num) {
        TrieNode *p = root;
        for (int i = 0; i < len; i++) {
            if (p->child[s[i] - base] == NULL) {
                p->child[s[i] - base] = newTrieNode();
            }
            p = p->child[s[i] - base];
        }
        p->num = num;
    }
    void work(TrieNode *p, char *s) {
        for(int i = 0; i < 60; i++) {
            if(p->num > 0) {
                ans.push_back(p->num);
                return ;
            }
            if(p->child[s[i] - base] == NULL) {
                return ;
            }
            p = p->child[s[i] - base];
        }
    }
    int main() {
    #ifndef ONLINE_JUDGE
        freopen("data.in", "r", stdin);
    #endif
        int M, N, t;
        scanf("%d%d", &M, &N);
        char temp[100];
        str[0] = 0;
        for(int i = 0; i < M; i++) {
            scanf("%s", temp);
            strcat(str, temp);
        }
        TrieNode *root = newTrieNode();
        for(int i = 0; i < N; i++) {
            scanf(" [Key No. %d] %s", &t, temp);
            insert_to_trie(root, temp, strlen(temp), t);
        }
        memset(flags, false, sizeof(flags));
        int len = strlen(str);
        for(int i = 0; i < len; i++) {
            work(root, str + i);
        }
        printf("Found key:");
        for(int i = 0, len = ans.size(); i < len; i++) {
            printf(" [Key No. %d]", ans[i]);
        }
        putchar('\n');
       return 0;
    }
  • 相关阅读:
    设置ios中imageView图片自适应,
    IOS应用之间调用
    XCode debug中添加查找debug和控制台的办法
    初学Java scirpt(判断、循环语句)
    Java Script 字符串操作
    初学 Java Script (算数运算及逻辑术语)
    Ubuntu 配置JDK
    SQL Server 跨库复制表方法小笔记
    Ubuntu 重装 mysql
    Java Script 数组操作
  • 原文地址:https://www.cnblogs.com/moonbay/p/2757643.html
Copyright © 2011-2022 走看看