zoukankan      html  css  js  c++  java
  • hdu2222赤裸裸的DFA

    赤裸裸的DFA,直接上模板了,可以交上去居然WA。仔细调了调,发现是原来自己写的模板有问题。之前写DFA模板的时候没有考虑到模式串会有重复并且还需要都统计的情况。大概改了改,能过这题了,但是代码改得挺乱,改天再整理整理吧。

    /*
     * hdu2222/win.cpp
     * Created on: 2013-1-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 MAX_PATTERN_NUM = 10010;
    const int MAX_PATTERN_LEN = 55;
    const int MAXQ = MAX_PATTERN_NUM * MAX_PATTERN_LEN;
    const int MAX_TEXT_LEN = 1000100;
    const int MAXK = 26; //字符集的大小
    const char BASE = 'a';
    typedef struct TrieNode {
        TrieNode* fail;
        TrieNode* next[MAXK];
        int cnt;
        TrieNode() {
            memset(next, 0, sizeof(next));
            cnt = 0;
            fail = NULL;
        }
    } TrieNode;
    TrieNode *que[MAXQ], *root;
    //文本字符串及模式串
    char msg[MAX_TEXT_LEN];
    char pattern[MAX_PATTERN_LEN];
    int N;//模式串的个数
    int nCount;
    int ans;
    void TrieInsert(const char *s, int index) {
        int i = 0;
        TrieNode *ptr = root;
        while (s[i]) {
            int idx = s[i] - BASE;
            if (!ptr->next[idx]) {
                ptr->next[idx] = new TrieNode();
            }
            ptr = ptr->next[idx];
            i++;
        }
        ptr->cnt++;
    }
    void Build_DFA() {
        int rear = 1, front = 0, i;
        que[0] = root;
        root->fail = NULL;
        while (rear != front) {
            TrieNode *cur = que[front++];
            for (i = 0; i < MAXK; i++) {
                if (!cur->next[i]) {
                    continue;
                }
                if (cur == root) {
                    cur->next[i]->fail = root;
                } else {
                    TrieNode *ptr = cur->fail;
                    while (ptr) {
                        if (ptr->next[i]) {
                            cur->next[i]->fail = ptr->next[i];
                            if (ptr->next[i]->cnt) {
                                //cur->next[i]->cnt++;
                            }
                            break;
                        }
                        ptr = ptr->fail;
                    }
                    if (!ptr) {
                        cur->next[i]->fail = root;
                    }
                }
                que[rear++] = cur->next[i];
            }
        }
    }
    void Run_DFA() {
        int i = 0;
        TrieNode *ptr = root;
        ptr = root;
        while (msg[i]) {
            int idx = msg[i] - BASE;
            while (!ptr->next[idx] && ptr != root) {
                ptr = ptr->fail;
            }
            ptr = ptr->next[idx];
            if (!ptr) {
                ptr = root;
            }
            TrieNode *tmp = ptr;
            while (tmp && tmp->cnt) {
                ans += tmp->cnt;
                tmp->cnt = 0;
                tmp = tmp->fail;
            }
            i++;
        }
    }
    void Init() {
        root = new TrieNode();
        scanf("%d", &N);
        for (int i = 1; i <= N; i++) {
            scanf(" %s", pattern);
            TrieInsert(pattern, i);
        }
    }
    
    int main() {
    #ifndef ONLINE_JUDGE
        freopen("data.in", "r", stdin);
    #endif
        int T;
        scanf("%d", &T);
        while(T--) {
            Init();
            Build_DFA();
            scanf(" %s", msg);
            ans = 0;
            Run_DFA();
            printf("%d\n", ans);
        }
        return 0;
    }
  • 相关阅读:
    SAP 用户权限解剖
    效率极低人群的七大习惯你占了几项? 迎客
    数据库到底用不用外键 迎客
    办公室生存——与人相处的30个原则 迎客
    虚拟机 VirtualBox 迎客
    fancybox 迎客
    遥志代理服务器软件CCProxy 迎客
    JRE和JDK的区别 迎客
    小众软件 迎客
    网络推广方法汇集 迎客
  • 原文地址:https://www.cnblogs.com/moonbay/p/2848207.html
Copyright © 2011-2022 走看看