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输入数据的第一部分 ...
随机推荐
- osg::GraphicsContext::WindowingSystemInterface Screen Resolution(屏幕分辨率)
unsigned int width, height; //获取系统分辨率 osg::GraphicsContext::WindowingSystemInterface *wsInterface = ...
- osgText::Text osg字体
#ifdef _WIN32 #include <Windows.h> #endif // _WIN32 #include<iostream> #include <osgV ...
- float和int转换
http://blog.sina.com.cn/s/blog_5c6f79380101bbrd.html https://blog.csdn.net/ganxingming/article/detai ...
- Microsoft Visual Studio(VS)启动报安装过程中无法运行
开机启动VS提示无法运行,很可能VS正在更新,可以等待几分钟更新完成,再次运行VS. 也可以把更新进程结束,进程名:VSIXAutoUpdate.exe
- Vue-cli安装,创建Vue项目
1.安装脚手架: npm install -g vue-cli 2.查看vue: vue 3.查看可以使用的模板: vue list 4.创建项目sell: vue init webpack sell ...
- python判断命令执行成功
if os.system('lss') !=0: print 'Without the command'
- elk收集tomcat日志
1.elk收集tomcat普通日志: 只在logstash节点增加如下文件,重启logstash即可: cat >>/home/logstash-6.3.0/config/tomcat_t ...
- Vue项目过程中遇到的小问题
1.给router-link添加点击事件 <router-link to="" @click.native=""></router-link& ...
- 如何找到linux centos7 中 redis.conf
我们假设redis正在运行,但是我们找不带redis的配置文件redis.conf. 正确的示范: (1)systemctl status redis ● redis.service - LSB: s ...
- vue 强制组件重新渲染
参考链接:https://blog.csdn.net/zyx1303031629/article/details/86656785