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>通过getElementsByTagName获取标签的class值
console.log(p[1].id); console.log(p.item(1).id); console.log(p[2].getAttribute("class")); ...
- 不同三维引擎渲染IFC数据效果对比
- osgViewer::View::setUpViewOnSingleScreen()
void ViewerBase::frame(double simulationTime) { if (_done) return; // OSG_NOTICE<<std::endl< ...
- PAT 甲级 1055 The World's Richest (25 分)(简单题,要用printf和scanf,否则超时,string 的输入输出要注意)
1055 The World's Richest (25 分) Forbes magazine publishes every year its list of billionaires base ...
- 02.提交bug
写代码最烦的也就是修复bug了,虽然这个避无可避…………………… a. bug的严重级别设置 1级:影响主要流程 ->在bug 的影响下,主流程 测试无法向下进行 2级:影响核心功能 -> ...
- 通过命令行给 XenServer 打补丁
安装 XenCenter 客户端,cmd 到 XenCenter 安装目录. 1.上传补丁到服务器,获得uuid xe patch-upload -s <服务器IP地址> -u root ...
- charles 白名单
本文参考:charles 白名单 charles 白名单 白名单工具,允许您阻止除选定位置之外的所有请求. 注意:如果一个请求与"黑名单"和"白名单"同时匹配成 ...
- darknet标签转化为COCO标签
import sys import json import cv2 import os import shutil dataset = { "info": { "desc ...
- [LuoguP1155]双栈排序_二分图_bfs
双栈排序 题目链接:https://www.luogu.org/problem/P1155 数据范围:略. 题解: 神仙题. 就第一步就够劝退了. 这个二分图非常不容易,首先只有两个栈,不是属于一个就 ...
- sql复合索引使用和注意事项
1.定义: 单一索引: 单一索引是指索引列为一列的情况,即新建索引的语句只实施在一列上; 复合索引: 复合索引也叫组合索引: 用户可以在多个列上建立索引,这种索引叫做复合索引(组合索引). 复合索引在 ...