字典树模板(前缀查找、整串查找)

学习了一波字典树,模板放出:

#include<math.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<sstream> //istringstream stm(string); stm >> x;
#define INF 2139062143
#define inf -2139062144
#define ll long long
using namespace std;

typedef struct Trie {
    int v;
    Trie *next[26];
} Trie;

Trie root;

void createTrie(char *str) {    //插入新的字符串
    int len = strlen(str);
    Trie *p = &root, *q;
    for(int i=0; i<len; ++i) {
        int id = str[i]-'a';
        if(p->next[id] == NULL) {
            q = (Trie *)malloc(sizeof(root));
            q->v = 1;
            for(int j=0; j<26; ++j)
                q->next[j] = NULL;
            p->next[id] = q;
            p = p->next[id];
        } else {
            p->next[id]->v++;
            p = p->next[id];
        }
    }
}

int findStr(char *str) {    //查找字符串
    int len = strlen(str);
    Trie *p = &root;
    for(int i=0; i<len; ++i) {
        int id = str[i]-'a';
        p = p->next[id];
        if(p == NULL)
            return 0;
    }
    int ans = p->v;
    for(int i = 0;i<26;i++){
        Trie *temp = p->next[i];
        if(temp != NULL)    ans -= temp->v;
    }
    return ans;
}

int findSuffix(char *str) {        // 查找前缀
    int len = strlen(str);
    Trie *p = &root;
    for(int i=0; i<len; ++i) {
        int id = str[i]-'a';
        p = p->next[id];
        if(p == NULL)
            return 0;
    }
    return p->v;
}

int main() {
    char str[15];
    int i;
    for(i=0; i<26; ++i)
        root.next[i] = NULL;
    while(gets(str) && str[0]!='\0')
        createTrie(str);
    memset(str, 0, sizeof(str));
    while(scanf("%s", str) != EOF) {
        int ans = findStr(str);
        printf("%d\n", ans);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/zinyy/p/9138962.html
今日推荐