hihocoder 1014(字典树)
Posted shutdown113
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hihocoder 1014(字典树)相关的知识,希望对你有一定的参考价值。
1014 : Trie树
题意:
给出n个字符串和m个询问,每个询问为一个字符串,问该字符串是给出的n个字符串中多少个字符串的前缀?
分析:
字典树的入门题。
学习资料:大佬博客
代码:
数组写法
#include <map> #include <queue> #include <math.h> #include <string> #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; #define ll long long #define ull unsigned long long #define cls(x) memset(x,0,sizeof(x)) #define clslow(x) memset(x,-1,sizeof(x)) const int wordLen=10; const int maxn=1e5+100; int n,m,rt,tot; int trie[maxn*wordLen][26],sum[maxn*wordLen]; void Insert(char* s,int rt) { int len=strlen(s); for(int i=0;i<len;i++){ int x=s[i]-‘a‘; if(trie[rt][x]==0){ trie[rt][x]=++tot; sum[tot]=0; } rt=trie[rt][x]; sum[rt]++; } } int Find(char* s,int rt) { int len=strlen(s); for(int i=0;i<len;i++){ int x=s[i]-‘a‘; if(trie[rt][x]==0){ return 0; } rt=trie[rt][x]; } return sum[rt]; } int main() { // freopen("in.txt","r",stdin); char s[26]; while(scanf("%d",&n)!=EOF) { rt=tot=1; for(int i=1;i<=n;i++){ scanf("%s",s); Insert(s,rt); } scanf("%d",&m); for(int i=1;i<=m;i++){ scanf("%s",s); printf("%d ",Find(s,rt)); } } return 0; }
指针写法
#include <map> #include <queue> #include <math.h> #include <string> #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; #define ll long long #define ull unsigned long long #define cls(x) memset(x,0,sizeof(x)) #define clslow(x) memset(x,-1,sizeof(x)) const int maxn=1e5+100; struct TrieNode { int cnt; TrieNode* nex[26]; }; TrieNode* root; TrieNode* build() { TrieNode* node=new TrieNode; node->cnt=0; cls(node->nex); return node; } void Insert(char* s) { int len=strlen(s); TrieNode* node=root; for(int i=0;i<len;i++){ int x=s[i]-‘a‘; if(node->nex[x]==NULL){ node->nex[x]=build(); } node=node->nex[x]; node->cnt++; } } int Find(char* s) { int len=strlen(s); TrieNode* node=root; for(int i=0;i<len;i++){ int x=s[i]-‘a‘; if(node->nex[x]==NULL){ return 0; } node=node->nex[x]; } return node->cnt; } void del(TrieNode* node) { for(int i=0;i<26;i++){ if(node->nex[i]!=NULL){ del(node->nex[i]); } } free(node); } int main() { // freopen("in.txt","r",stdin); int n,m; char s[26]; while(scanf("%d",&n)!=EOF) { root=build(); for(int i=1;i<=n;i++){ scanf("%s",s); Insert(s); } scanf("%d",&m); for(int i=1;i<=m;i++){ scanf("%s",s); printf("%d ",Find(s)); } del(root); } return 0; }
以上是关于hihocoder 1014(字典树)的主要内容,如果未能解决你的问题,请参考以下文章