动态建树之——出现了几次的单词有几个
2016-08-15 14:33
239 查看
题目:poj2945
题意:计算出现了1~n次的单词各有几次
解答:字典树。建立之后dfs查找
注意:mle:树的节点数目定义太大了。因为题目只有ACGT四个字母所以节点数定义为4就足够
map定义啥的不能写在函数外面
题意:计算出现了1~n次的单词各有几次
解答:字典树。建立之后dfs查找
注意:mle:树的节点数目定义太大了。因为题目只有ACGT四个字母所以节点数定义为4就足够
map定义啥的不能写在函数外面
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> using namespace std; const int MAXN = 20020; int ans[MAXN]; int m; const int sonnum = 4,base = 'A'; int arr[4] = {0,2,6,19}; struct Trie { int num; bool terminal; struct Trie *son[sonnum]; }; Trie *NewTrie() { Trie *temp = new Trie; temp -> num = 1; temp -> terminal = false; for(int i = 0;i < sonnum;i++) temp -> son[i] = NULL; return temp; } void Insert(Trie *pnt,char *s,int len) { map<int,int> Map; Map[0] = 0; Map[2] = 1; Map[6] = 2; Map[19] = 3; Trie *temp = pnt; for(int i = 0;i < len;i++) { if(temp -> son[Map[s[i]-base]] == NULL) { temp -> son[Map[s[i]-base]] = NewTrie(); } else temp -> son[Map[s[i]-base]] -> num++; temp = temp -> son[Map[s[i]-base]]; } temp -> terminal = true; return; } void dfs(Trie *pnt,int step) { if(step == m) { if(pnt -> terminal == true) ans[pnt -> num]++; return; } for(int i = 0;i < 4;i++) { Trie *temp = pnt; if(temp -> son[i] != NULL) dfs(temp -> son[i],step + 1); } return; } int main() { int n; char a[25]; while(~scanf("%d%d",&n,&m)) { if(n == 0 && m == 0) break; Trie *tree = NewTrie(); memset(ans,0,sizeof(ans)); for(int i = 0;i < n;i++) { scanf("%s",a); Insert(tree,a,m); } dfs(tree,0); for(int i = 1;i <= n;i++) printf("%d\n",ans[i]); } return 0; }
相关文章推荐
- map 遍历练习 每个单词出现了几次
- 动态建树之——一个单词是否在其他单词中以前缀的形式存在
- 筛选英语文章出现频率最多的前几个单词
- 如何统计在一篇文章中某个单词出现了几次,以及第一次出现的位置
- C动态内存分配几个细节
- 选中单选按钮时动态出现相应内容
- vbs:能算出一个字符在一字段里共出现有几次的函数
- 介绍几个基于动态语言的快速Web开发框架
- 颠倒单词的出现次序
- 关于Asp.net 页面动态加载用户控件,出现“未能加载视图状态”的原因
- 统计一篇文章中单词出现的频率(java 版)
- 美国高中毕业生必须知道的100个单词,你知道几个?
- JAVA中几个易混淆关键词的理解:行为,隐藏,组合和继承,覆写和重载,多形(多态)性,动态绑定,上溯造型,抽象类,接口
- 报关单上常出现的英文单词缩写
- Java 读取一段英文文档统计每个单词出现的次数和单词的总数
- java中动态载入类、方法的几个玩意儿
- 听力中常出现的日文单词
- 局域网访问XP出现不可访问的几个问题
- 单词出现统计程序
- 代码编写中出现较多的几个问题