[模板]Trie
Posted xutianshu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[模板]Trie相关的知识,希望对你有一定的参考价值。
Trie是一种存储字符串的数据结构,每个val不为0的结点代表一个字符串的结尾。
支持插入,查找,删除,查询前缀等操作(删除操作待实现)。
缺点是空间浪费极大,空间不足时可用三叉Trie代替。
#include <bits/stdc++.h> using namespace std; typedef long long int LL; #define st first #define nd second #define pb push_back #define mp make_pair #define pll pair <LL, LL> #define pii pair <int, int> #define rep(i,x) for(int i=1;i<=x;i++) const int N = 1e6+7; const int MX = 1e9+7; const LL INF = 1e18+9LL; const int mod = 20071027; int n,m; struct Trie{ int val[400010],ch[400010][26]; int sz; void init(){ memset(ch[0],0,sizeof(ch[0])); sz=1; } int index(char c){return c-‘a‘;} void insert(char* a,int v){ int u=0,l=strlen(a); for(int i=0;i<l;i++){ int x=index(a[i]); if(!ch[u][x]){ memset(ch[sz],0,sizeof(ch[sz])); val[sz]=0; ch[u][x]=sz++; } u=ch[u][x]; } val[u]=v; } int find(char* a){ int u=0,l=strlen(a); for(int i=0;i<l;i++){ int x=index(a[i]); if(!ch[u][x])return 0; u=ch[u][x]; } return val[u]; } void printall(int u,string s){ if(val[u])cout<<s<<" "<<val[u]<<endl; for(char i=‘a‘;i<=‘z‘;i++)if(ch[u][index(i)])printall(ch[u][index(i)],s+i); } int longest_prefix(char* a){ int u=0,l=strlen(a),res=-1; for(int i=0;i<l;i++){ int x=index(a[i]); if(val[ch[u][x]])res=i; if(!ch[u][x])break; u=ch[u][x]; } return res; } }trie; int main(){ trie.init(); cin>>n; rep(i,n){ char a[410]; int x; scanf("%s%d",a,&x); trie.insert(a,x); } trie.printall(0,""); cin>>m; rep(i,m){ char a[410]; scanf("%s",a); cout<<trie.find(a)<<endl; int i; for(i=0;i<=trie.longest_prefix(a);i++)printf("%c",a[i]); if(i)putchar(‘ ‘); } }
以上是关于[模板]Trie的主要内容,如果未能解决你的问题,请参考以下文章