首页 > 代码库 > (字典树)HDU - 1251 统计难题
(字典树)HDU - 1251 统计难题
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1251
题意:先给定一些单词构成字典,然后再查一些在字典中以一些字母串为前缀的单词有几个。
分析:很基础很普通的字典树题目,但是用动态的字典树会超时,所以要用静态的字典树。
代码:
1 #include <set> 2 #include <map> 3 #include <list> 4 #include <cmath> 5 #include <queue> 6 #include <vector> 7 #include <bitset> 8 #include <string> 9 #include <cctype>10 #include <cstdio>11 #include <cstring>12 #include <cstdlib>13 #include <iostream>14 #include <algorithm>15 16 using namespace std;17 18 typedef long long ll;19 typedef unsigned long long ull;20 #define inf (0x3f3f3f3f)21 #define lnf (0x3f3f3f3f3f3f3f3f)22 #define eps 1e-823 int sgn(double a){return a < -eps ? -1 : a < eps ? 0 : 1;}24 25 //--------------------------26 27 struct Trie_node {28 int cnt;29 int next[26];30 }tree[400010];31 int nxt;32 33 int createTrieNode() {34 memset(&tree[nxt], 0, sizeof(Trie_node));35 return nxt++;36 }37 38 void Trie_insert(string& word) {39 int rt=0;40 int len=word.length();41 for(int i=0;i<len;i++){42 int id = word[i] - ‘a‘;43 if(!tree[rt].next[id]){44 tree[rt].next[id]=createTrieNode();45 }46 rt=tree[rt].next[id];47 tree[rt].cnt++;48 }49 }50 51 int Trie_search(string& word) {52 int rt=0;53 int len=word.length();54 for(int i=0;i<len;i++){55 int id=word[i]-‘a‘;56 if(!tree[rt].next[id])return 0;57 rt=tree[rt].next[id];58 }59 return tree[rt].cnt;60 }61 62 string word;63 64 void init(){65 66 }67 68 void solve() {69 nxt=1;70 memset(&tree[0],0,sizeof(Trie_node));71 while(getline(cin,word)) {72 if(word=="")break;73 Trie_insert(word);74 }75 while(getline(cin,word)){76 cout<<Trie_search(word)<<endl;77 }78 }79 80 int main() {81 82 #ifndef ONLINE_JUDGE83 freopen("in.txt", "r", stdin);84 //freopen("out.txt", "w", stdout);85 #endif86 iostream::sync_with_stdio(false);87 init();88 solve();89 return 0;90 }
(字典树)HDU - 1251 统计难题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。