trie 树 模板
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #define maxn 2000010 using namespace std; int tot, n, m, rt; int trie[maxn][26], sum[400001]; char s[22]; //bool vis[maxn];查询整个单词用 void build() { int len = strlen(s); rt = 0; for(int i=0; i<len; i++) { int x=s[i]-'a'; if(trie[rt][x]==0)//现在插入的字母在之前同一节点处未出现过 { trie[rt][x]=++tot;//字母插入一个新的位置,否则不做处理 } //sum[trie[rt][x]]++; 前缀后移一个位置保存前缀出现的次数 rt=trie[rt][x];//为下个字母的插入做准备 } /*vis[rt]=true;标志该单词末位字母的尾结点,在查询整个单词时用到*/ } bool qp() { int len = strlen(s); rt = 0; for(int i=0; i<len; i++) { int x=s[i]-'a'; if(trie[rt][x]==0)return false;//以rt为头结点的x字母不存在,返回0 rt=trie[rt][x];//为查询下个字母做准备 } return true; //查询整个单词时,应该return vis[rt] , 查询前缀出现的次数时,应该return sum[rt] } int main() { tot=0; scanf("%d",&n); for(int i=1;i<=n;i++) { cin>>s; build(); } scanf("%d",&n); for(int i=1; i<=n; i++) { cin>>s; if(qp()) printf("YES\n"); else printf("NO\n"); } scanf("%d",&m); for(int i=1; i<=m; i++) { cin>> s; printf("%d",qp()); } return 0; }
模板题:208. 实现 Trie (前缀树) - 力扣(LeetCode)
class Trie { public: struct Node { Node* tree[26]; bool is_tail; Node() { for (int i = 0; i < 26; i++) { tree[i] = nullptr; } is_tail = false; } }; Node* head; int cnt; Trie() { cnt = 0; head = new Node(); } void insert(string word) { Node* rt = head; for (int i = 0; i < word.size(); i++) { int nx = word[i] - 'a'; if (rt->tree[nx] == nullptr) { rt->tree[nx] = new Node(); } rt = rt->tree[nx]; } rt->is_tail = true; } bool search(string word) { Node* rt = head; for (int i = 0; i < word.size(); i++) { int nx = word[i] - 'a'; if (rt->tree[nx] == nullptr) { return false; } rt = rt->tree[nx]; } return rt->is_tail; } bool startsWith(string prefix) { Node* rt = head; for (int i = 0; i < prefix.size(); i++) { int nx = prefix[i] - 'a'; if (rt->tree[nx] == nullptr) { return false; } rt = rt->tree[nx]; } return true; } }; /** * Your Trie object will be instantiated and called as such: * Trie* obj = new Trie(); * obj->insert(word); * bool param_2 = obj->search(word); * bool param_3 = obj->startsWith(prefix); */
int idx(char s){ if(s >= '0' && s <= '9'){ return s - '0'; } else if(s >= 'A' && s <= 'Z'){ return 10 + s - 'A'; } else{ return 36 + s - 'a'; } }
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; char s[11]; int n,m; bool p; struct node { int count; node * next[26]; }*root; node * build() { node * k=new(node); k->count=0; memset(k->next,0,sizeof(k->next)); return k; } void insert() { node * r=root; char * word=s; while(*word) { int id=*word-'a'; if(r->next[id]==NULL) r->next[id]=build(); r=r->next[id]; r->count++; word++; } } int search() { node * r=root; char * word=s; while(*word) { int id=*word-'a'; r=r->next[id]; if(r==NULL) return 0; word++; } return r->count; } int main() { root=build(); scanf("%d",&n); for(int i=1;i<=n;i++) { cin>>s; insert(); } scanf("%d",&m); for(int i=1;i<=m;i++) { cin>>s; printf("%d\n",search()); } }
自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。

浙公网安备 33010602011771号