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输入数据的第一部分 ...
随机推荐
- JavaScript的深拷贝
javaScript的拷贝有浅拷贝和深拷贝.拷贝我们一般拷贝对象,获取对象的内容(字段.函数)都给复制一遍 浅拷贝:一般只是简单的赋值 //浅拷贝 var obj1={name:"cat&q ...
- VC3DGraphicsWindowQt
VC3DGraphicsWindowQt::VC3DGraphicsWindowQt(QWidget* parent, Qt::WindowFlags f) { osg::DisplaySetting ...
- 20Flutter通过TabController定义顶部tab切换,介绍生命周期函数
基本使用: import 'package:flutter/material.dart'; class TabBarControllerPage extends StatefulWidget { Ta ...
- C++线程互斥、同步
一.线程互斥 如果多个线程需要访问且可能修改同一个变量,那么需要加锁,保证同一时刻只有一个线程可以访问,这个动作即最小“原子操作” 方式1: 使用c++提供的类mutex,lock,unlock即可 ...
- [Feature] Feature selection - Embedded topic
基于惩罚项的特征选择法 一.直接对特征筛选 Ref: 1.13.4. 使用SelectFromModel选择特征(Feature selection using SelectFromModel) 通过 ...
- LeetCode_122. Best Time to Buy and Sell Stock II
122. Best Time to Buy and Sell Stock II Easy Say you have an array for which the ith element is the ...
- Go 自定义包引入报错
配置文件 GO111MODULE=on 设置为on时,go命令行会使用modules,而一点也不会去GOPATH目录下查找.但自定义包在 $GOPATH/github.com/winyh/strrev ...
- MYSQL 启动问题
1.日志中出现 [ERROR] InnoDB: The Auto-extending innodb_system data file './ibdata1' is of a different si ...
- Spring Cloud(7.1):安装Kafka和Redis
Kafka安装 (1)从官方(http://kafka.apache.org/downloads)下载安装包.kafka安装包和一般安装包的命名方式不一样,我们看一个kafka包命名:kafka_2. ...
- javascript——URI的编解码方法
有效的URI(统一资源标示符)是不能包含某些字符的,如空格,所以需要进行编码,编码方法有:encodeURI()和encodeURIComponent(), 对编的码进行解码方法有:decodeURI ...