标签:前缀 htm set ref printf 选择 次数 main oid
本文基于https://www.cnblogs.com/TheRoadToTheGold/p/6290732.html
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int amn=1e5+5; 4 int trie[amn][26],tid; 5 bool isw[amn]; 6 int sum[amn]; 7 void init(){ 8 memset(isw,0,sizeof isw); 9 memset(trie,0,sizeof trie); 10 memset(sum,0,sizeof sum); 11 tid=0; ///节点在整个树中的序号 12 } 13 void insert(char *s){ ///插入一个单词,如果想查询后缀就反向插入 14 int len=strlen(s),rt=0; 15 for(int i=0;i<len;i++){ 16 int id=s[i]-‘a‘; ///看选择当前节点的哪个儿子 17 if(!trie[rt][id]) 18 trie[rt][id]=++tid; 19 sum[rt]++; ///前缀统计 20 rt=trie[rt][id]; 21 } 22 isw[rt]=1; ///结尾单词标记 23 } 24 bool isword(char *s){ ///查询是否存在这个单词 25 int len=strlen(s),rt=0; 26 for(int i=0;i<len;i++){ 27 int id=s[i]-‘a‘; 28 if(!trie[rt][id])return 0; 29 rt=trie[rt][id]; 30 } 31 return isw[rt]; 32 } 33 bool isprefix(char *s){ ///查询是否存在这个前缀 34 int len=strlen(s),rt=0; 35 for(int i=0;i<len;i++){ 36 int id=s[i]-‘a‘; 37 if(!trie[rt][id])return 0; 38 rt=trie[rt][id]; 39 } 40 return 1; 41 } 42 int prefix_sum(char *s){///查询当前前缀出现的次数 43 int len=strlen(s),rt=0; 44 for(int i=0;i<len;i++){ 45 int id=s[i]-‘a‘; 46 if(!trie[rt][id])return 0; 47 rt=trie[rt][id]; 48 } 49 return sum[rt]; 50 } 51 int main(){ 52 init(); 53 char *s="hello",*s1="he"; 54 insert(s); 55 printf("isword:%d isprefix:%d prefix_sum:%d\n",isword(s),isprefix(s1),prefix_sum(s1)); 56 }
标签:前缀 htm set ref printf 选择 次数 main oid
原文地址:https://www.cnblogs.com/brainm/p/11259933.html