POJ2945(Find the Clones)--字典树,map
题意:给你n个规定长度的单词,问你其中出现了1次的单词,出现两次的单词...出现n次单词分别有多少个。
当然这题map也能过,但是这里介绍字典树的做法。
首相对于n个单词存入树中,当然建树过程中遇到一样的单词就把那个单词最后一个结点的计数++就行。否则为这个单词是第一次建立,计数为1。
count[i]数组用来存放出现i次的字符串出现的次数。
Travel函数用来递归统计每个单词,将不同出现次数的数字记录到arr数组中,最后打印count数组即可
#include <iostream>
#include <string>
#include <cstring>
#include <fstream>
#include <map>
#include <algorithm>
#include <sstream>
#include <cstdio>
using namespace std; const int LetterCount = ;//最大长度 struct Node
{
Node* next[LetterCount];//结点的下一个指针
int count;
bool end;//标记是否为最后一个单词
Node();
}; Node::Node()
{
for (int i = ; i < LetterCount; i++)
{
next[i] = NULL;
}
count = ;
end = false;
} class Trie
{
protected:
Node* root;
void GreateRoot();
void Distroy(const Node* root);
void Travel(Node* root, int* arr);
public:
Trie();
~Trie();
int Insert(char* word);
int Query(char* word);
void Travel(int* arr, int n);
}; Trie::Trie()
{
root = NULL;
GreateRoot();
} Trie::~Trie()
{
Distroy(root);
} void Trie::GreateRoot()
{
if (!root)//根结点为false
{
root = new Node();//建根
for (int i = ; i < LetterCount; i++)
{
root->next[i] = NULL;
}
}
} void Trie::Distroy(const Node* root)
{
if (!root)
{
return;
}
for (int i = ; i < LetterCount; i++)
{
if (root->next[i] != NULL)
{
Distroy(root->next[i]);
}
}
delete[] root;
} int Trie::Insert(char* word)
{
Node* p = root;//根结点为root
int length = strlen(word);//计算长度
for (int i = ; i < length; i++)
{
int index = word[i] - 'A';
if (!(p->next[index]))//当前没有那个字母
{
Node* q = new Node();
q->end = false;
for (int j = ; j < LetterCount; j++)
{
q->next[j] = NULL;
}
p->next[index] = q;
}
p = p->next[index];
}
if (p->end)
{
p->count++;
}
else
{
p->end = true;
p->count = ;
}
return p->count;
} int Trie::Query(char* word)
{
Node* p = root;
bool found = true;
int length = strlen(word);
for (int i = ; i < length; i++)
{
int index = word[i] - 'A';
p = p->next[index];
if (!p)//p为false
{
found = false;//没找到
break;
}
}
if (!found || !p->end)//没找到或已经是结束标记
{
return ;
}
return p->count;//否则返回计数
} void Trie::Travel(Node* root, int* arr)
{
if (!root)
{
return;
}
if (root->end)//表示为最后一个词
{
arr[root->count]++;
return;
}
for (int i = ; i < LetterCount; i++)
{
Travel(root->next[i], arr);//递归计算
}
} void Trie::Travel(int* arr, int n)
{
for (int i = ; i < n; i++)
{
arr[i] = ;
}
Travel(root, arr);
} class FindTheClones
{
protected:
int n;
int* count;
Trie tree;
public:
FindTheClones(int n);
~FindTheClones();
void Insert(char* word);
void Travel();
void Output() const;
}; FindTheClones::FindTheClones(int n)
{
this->n = n;
count = new int[n + ];
memset(count, , sizeof(int) * (n + ));
} FindTheClones::~FindTheClones()
{
delete[] count;
} void FindTheClones::Insert(char* word)
{
tree.Insert(word);
} void FindTheClones::Travel()
{
tree.Travel(count, n + );
} void FindTheClones::Output() const
{
for (int i = ; i < n + ; i++)
{
printf("%d\n", count[i]);
}
} int main()
{
int n = , m = ;
while (scanf("%d%d", &n, &m))
{
if (n <= )
{
break;
}
char str[];
FindTheClones obj(n);
for (int i = ; i < n; i++)
{
scanf("%s", str);
obj.Insert(str);
}
obj.Travel();
obj.Output();
}
return ;
}
POJ2945(Find the Clones)--字典树,map的更多相关文章
- I: Carryon的字符串排序(字典树/map映射)
2297: Carryon的字符串 Time Limit: C/C++ 1 s Java/Python 3 s Memory Limit: 128 MB Accepted ...
- POJ 1002 487-3279(字典树/map映射)
487-3279 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 309257 Accepted: 5 ...
- poj1002 字典树+map+查询单词出现次数
487-3279 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 309235 Accepted: 55223 Descr ...
- ACM学习历程—HDU 4287 Intelligent IME(字典树 || map)
Description We all use cell phone today. And we must be familiar with the intelligent English input ...
- ZOJ 3674 Search in the Wiki(字典树 + map + vector)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4917 题意:每一个单词都一些tips单词. 先输入n个单词和他们的t ...
- POJ2945 Find the Clones trie树
建一颗$trie$树(当然你哈希也资瓷),边插边更新,看看搜到最底时有多少个字符串,然后更新. #include<cstdio> #include<iostream> #inc ...
- hdoj 1251 字典树||map
统计难题 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others)Total Submi ...
- 字典树+map
Problem Description Carryon最近喜欢上了一些奇奇怪怪的字符,字符都是英文小写字母,但奇怪的是a可能比b小,也可能比b大,好奇怪.与此同时,他拿到了好多的字符串,可是看着很不顺 ...
- HDU1251 统计难题(字典树|map
Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Input输入数据的第一部分 ...
随机推荐
- main方法的详解
格式 * public static void main(String[] args) {} 针对格式的解释 public 被jvm调用,访问权限足够大. static 被jvm调用,不用创建对象,直 ...
- [Java复习] 缓存Cache part1
1. 在项目中是如何使用缓存的?为什么要用?不用行不行?用了可能会有哪些不良后果? 结合项目业务,主要两个目的:高性能和高并发.缓存走内存,天然支持高并发. 不良后果: 缓存与DB双写不一致 缓存雪崩 ...
- linux vim基本操作
vim 是一款功能强大的文本编辑器, 默认有三种模式: 命令模式, 插入模式, 编辑模式, 使用# vim file 打开一个文件时,默认进入命令模式, 不同模式直接的切换如下 a. 命令模式切 ...
- java编写的一段简单的网络爬虫demo代码
功能: 从网站上下载附件,并从页面中提取页面文章内容 关于NIO 在大多数情况下,Java 应用程序并非真的受着 I/O 的束缚.操作系统并非不能快速传送数据,让 Java 有事可做:相反,是 JVM ...
- 【Leetcode_easy】754. Reach a Number
problem 754. Reach a Number solution1: class Solution { public: int reachNumber(int target) { target ...
- cq三期备注说明
1.关于导航栏添加登陆拦截操作
- pytest文档20-pytest-html报告优化(添加Description)
前言 pytest-html测试报告默认是不展示用例描述Description内容,之前用unittest生成的报告是可以展示用例的描述,也就是test开头的用例下三个引号里面的注释(docstrin ...
- linux下的进程通信之管道与FIFO
概念:管道是由内核管理的一个缓冲区,相当于我们放入内存中的一个纸条.管道的一端连接一个进程的输出.这个进程会向管道中放入信息.管道的另一端连接一个进程的输入,这个进程取出被放入管道的信息. 优点:不需 ...
- 删除Excel表格中一堆英文中的汉字
昨天需要处理一个Excel文件,删除一堆英文里的汉字,开始搜了下方法,没找到,然后手动一个多小时,弄了一半吧也就,结果电脑卡了,忘了保存,就白做了...不知道为啥这次没有自动保存,所以,重要的事说三遍 ...
- java调用jacob组件实现word转pdf,HTML等出现的问题
1.部署项目的服务器上必须安装WPS或Word office: 2.将jacob.jar文件放入%JAVA_HOME%\jre中: 3.将.dll文件放入%JAVA_HOME%\jre\bin中: 4 ...