Trie

#include<iostream>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cstdio>
#define Max 26
using namespace std;

struct TrieNode{
    int ti;
    TrieNode *next[Max];
    TrieNode(){
        ti=0;
        memset(next,NULL,sizeof(next));
    }
};

void Insert(TrieNode *root,char * str){
    int len=strlen(str);
    TrieNode *p=root;
    for(int i=0;i<len;++i){
        int id=str[i]-'a';
        if(p->next[id]==NULL)
            p->next[id]=new TrieNode();
        p=p->next[id];
        p->ti++;
    }
}

int searchTrie(TrieNode *root,char *str){
    TrieNode *p=root;
    int len=strlen(str);
    for(int i=0;i<len;++i){
        int id=str[i]-'a';
        if(p->next[id]==NULL)
            return 0;
        p=p->next[id];
    }
    return p->ti;
}

int Behind(TrieNode *root,char *str){
    TrieNode *p=root;
    int len=strlen(str);
    int ans=0;
    for(int i=0;i<len;++i){
        int id=str[i]-'a';
        for(int j=id+1;j<Max;++j)
            if(p->next[j]!=NULL)
                ans+=p->next[j]->ti;
        p=p->next[id];
    }
    for(int i=0;i<Max;++i)
        if(p->next[i]!=NULL)
            ans+=p->next[i]->ti;
    return ans;
}

int n,m,ans;
char str[50005];
char now[50006];

int main(){
    TrieNode *root=new TrieNode();
    scanf("%d",&n);
    for(int i=0;i<n;++i){
    	scanf("%s",str);
    	Insert(root,str);
    }
    scanf("%d",&m);
    for(int i=1;i<=m;++i){
    	scanf("%s",str);
    	printf("%d
",searchTrie(root,str));
    }
    delete root;
    return 0;
}
原文地址:https://www.cnblogs.com/qdscwyy/p/7792206.html