hdu 1251 统计难题【ma||字典树】
2017-04-06 00:10
330 查看
Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
Input输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.
注意:本题只有一组测试数据,处理到文件结束.
Output对于每个提问,给出以该字符串为前缀的单词的数量.
Sample Input
Sample Output
思路:map的多面应用,多做点水题加深一下,拓宽一下用法;
思路:偶然看到Trie树解法:就是查找以此部分字符开头的字符串,牺牲空间优化时间;《上篇转有详解》
Input输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.
注意:本题只有一组测试数据,处理到文件结束.
Output对于每个提问,给出以该字符串为前缀的单词的数量.
Sample Input
banana band bee absolute acm ba b band abc
Sample Output
2 3 1 0
思路:map的多面应用,多做点水题加深一下,拓宽一下用法;
#include<cstdio> #include<cstring> #include<iostream> #include<map> #include<algorithm> using namespace std; map<string,int> q; char str[1010]; int main() { q.clear(); while(gets(str)!=NULL) { int len=strlen(str); if(!len) break; //空格结束 for(int i=len;i>0;i--) { str[i]='\0'; //倒着枚举字符串 q[str]++; } } while(gets(str)!=NULL) { //map<string,int>::iterator it;//加输出查看map //for(it=q.begin();it!=q.end();it++) // cout<<it->first<<endl; cout<<q[str]<<endl; } return 0; }
思路:偶然看到Trie树解法:就是查找以此部分字符开头的字符串,牺牲空间优化时间;《上篇转有详解》
#include<cstdio> #include<cmath> #include<iostream> #include<cstring> #include<algorithm> #include<map> using namespace std; typedef struct Trie_node { int count; // 统计单词前缀出现的次数 struct Trie_node*next[26]; // 指向各个子树的指针 bool exist; // 标记该结点处是否构成单词 }TrieNode,*Trie; TrieNode*createTrieNode() { TrieNode*node=(TrieNode*)malloc(sizeof(TrieNode)); node->count=0; node->exist=false; memset(node->next,0,sizeof(node->next)); //初始化为空指针 return node; } void Trie_insert(Trie root,char* word) { Trie node=root; char *p=word; int id; while(*p) { id=*p-'a'; if(node->next[id]==NULL) { node->next[id]=createTrieNode(); } node=node->next[id]; // 每插入一步,相当于有一个新串经过,指针向下移动 ++p; node->count+=1; // 这行代码用于统计每个单词前缀出现的次数(也包括统计每个单词出现的次数) } node->exist=true; // 单词结束的地方标记此处可以构成一个单词 } int Trie_search(Trie root,char* word) { Trie node=root; char *p=word; int id; while(*p) { id=*p-'a'; node = node->next[id]; ++p; if(node==NULL) return 0; } return node->count; } int main() { Trie root=createTrieNode(); // 初始化字典树的根节点 char str[12]; bool flag=false; while(gets(str)) { if(flag) printf("%d\n",Trie_search(root,str)); else { if(strlen(str)!=0) Trie_insert(root,str); else flag=true; } } return 0; }
相关文章推荐
- [字典树 ]hdu 1251 统计难题
- HDU 1251 统计难题 字典树
- HDU 1251 统计难题 -- 字典树
- HDU--1251 -- 统计难题 [字典树基本应用] [用数组事先分配空间以节约时间]
- hdu1251 统计难题 字典树
- HDU 1251统计难题(字典树)
- HDU 1251统计难题 字典树
- hdu 1251 统计难题(字典树)
- HDU 1251 统计难题(字典树)
- hdu 1251 统计难题(字典树)
- 统计难题 hdu 1251 字典树
- HDU 1251 统计难题(字典树)
- hdu 1251 统计难题(字典树)
- HDU 1251 统计难题 字典树入门(Trie)
- HDU 1251 统计难题(字典树)
- HDU 1251 统计难题 (java版字典树)
- HDU 1251 统计难题(字典树)
- hdu 1251 统计难题(字典树)
- hdu 1251 统计难题 字典树
- hdu 1251 统计难题(字典树模版)