题意:给你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的更多相关文章

  1. I: Carryon的字符串排序(字典树/map映射)

    2297: Carryon的字符串 Time Limit: C/C++ 1 s      Java/Python 3 s      Memory Limit: 128 MB      Accepted ...

  2. POJ 1002 487-3279(字典树/map映射)

    487-3279 Time Limit: 2000MS        Memory Limit: 65536K Total Submissions: 309257        Accepted: 5 ...

  3. poj1002 字典树+map+查询单词出现次数

    487-3279 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 309235   Accepted: 55223 Descr ...

  4. ACM学习历程—HDU 4287 Intelligent IME(字典树 || map)

    Description We all use cell phone today. And we must be familiar with the intelligent English input ...

  5. ZOJ 3674 Search in the Wiki(字典树 + map + vector)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4917 题意:每一个单词都一些tips单词. 先输入n个单词和他们的t ...

  6. POJ2945 Find the Clones trie树

    建一颗$trie$树(当然你哈希也资瓷),边插边更新,看看搜到最底时有多少个字符串,然后更新. #include<cstdio> #include<iostream> #inc ...

  7. hdoj 1251 字典树||map

    统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submi ...

  8. 字典树+map

    Problem Description Carryon最近喜欢上了一些奇奇怪怪的字符,字符都是英文小写字母,但奇怪的是a可能比b小,也可能比b大,好奇怪.与此同时,他拿到了好多的字符串,可是看着很不顺 ...

  9. HDU1251 统计难题(字典树|map

    Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Input输入数据的第一部分 ...

随机推荐

  1. 解决Vue编译和打包时频繁内存溢出情况CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory

    解决Vue编译和打包时频繁内存溢出情况CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 如上图所示:频繁出现此 ...

  2. OSError: image file is truncated (28 bytes not processed)

    解决办法: 在代码中添加两行 from PIL import ImageFile ImageFile.LOAD_TRUNCATED_IMAGES = True

  3. linux修改配置文件解决mysql中文乱码和指定数据库存储引擎

    如题,mysql数据库的中文显示乱码: 先看下原来数据库里的字符编码: mysql> show variables like '%character_set%'; +-------------- ...

  4. zip格式压缩文件辅助类(ZipHelper)

    /// <summary> /// 压缩解压文件 /// </summary> public class ZipHelper { /// <summary> /// ...

  5. Qt编写自定义控件39-导航标签

    一.前言 在很多菜单导航界面中,当单击了二级菜单或者三级菜单以后,顶部会显示带箭头或者其他标识的导航标签,可以单击该标签快速切换到对应的界面,也作为指示当前处于哪一级菜单下的界面,主要在WEB中大肆流 ...

  6. topcoder srm 633 div1

    problem1 link 如果两个循环之内可以跳完,那么我们只要让这些步数之内的数字组成两个数字$p,q,p\leq q$,使得$p,q,x$组成三角形即可($p+q\geq x,p+x\geq q ...

  7. NGUI 9宫格输入的一个巨坑

    UILabel 中的maxlines = 0,输入没有问题.如果maxlines=1,输入出错

  8. Work? working!

    0.总要想想为什要做这个(目的是什么,优缺点,必要性,不用行不行,产品定位,如何保证最后的稳定性) 1.如何逐步排查问题所在(做实验+分析排查:不同的实验手段) 2.如何利用网络(搜索问题的所在,确定 ...

  9. jqGrid获取选中行id集合

    $("#jqGrid").jqGrid("getGridParam","selarrrow");

  10. Mac配置虚拟环境Virtualenv,安装Python科学计算包详解

    参考: https://www.jianshu.com/p/51140800e8b4 安装 virtualenvwrapper Virtaulenvwrapper是virtualenv的扩展包,可以更 ...