题目大意

将一副牌进行编号,四种花色分别标记为'C'、'D'、'H'、'S',数值标记为'A'、'1'、'2'、'3'、'4'、'5'、'6'、'7'、'8'、'9'、'10'、'J'、'Q'、'K',则一张牌可以标记为 “数值+花色”,比如 7D, AH, 10S等。 
    给出N个牌的序列,每个序列视为一条链,每张牌视为链中的一个节点,为了方便存储,可以将具有相同后缀的链聚合在一起。求聚合之后的链中所有节点的个数。

题目分析

具有相同后缀的可以合并在一起,则等价于将每条链翻转之后,具有相同前缀的可以将前缀共享合并,这就是典型的trie结构。因此,需要将牌进行hash之后,获得索引,然后插入trie树中。

  其中,翻转操作可以通过stack的push/pop来实现。
    为了求得总共的节点的数目,可以使用静态数组方式而不是指针方式来存储trie树。

实现(c++)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stack>
using namespace std;
#define MAX_CHILD_NUM 53
char gSuit[4] = { 'C', 'D', 'H', 'S' };
char gValue[4] = { 'A', 'J', 'Q', 'K' };
int gValueHash[4] = { 0, 10, 11, 12 };
struct Card{
int suit;
int value;
};
void CardHash(char* card, Card& car){
char suit, value;
if (strlen(card) == 3){
suit = card[2];
car.value = 9;
}
else{
suit = card[1];
value = card[0]; if (value >= '2' && value <= '9'){
car.value = value - '0' - 1;
}
else{
for (int i = 0; i < 4; i++){
if (gValue[i] == value){
car.value = gValueHash[i];
break;
}
}
}
}
int i;
for (i = 0; i < 4; i++){
if (gSuit[i] == suit){
break;
}
}
car.suit = i;
} struct TrieNode{
int count;
int childs[MAX_CHILD_NUM];
TrieNode(){
count = 0;
memset(childs, 0, sizeof(childs));
}
}; TrieNode gNodes[100000];
int gIndex; void Insert(int root, stack<Card>& card_stack){
int node = root;
Card card;
while (! card_stack.empty()){
card = card_stack.top();
card_stack.pop(); int index = 13 * card.suit + card.value;
if (gNodes[node].childs[index] == 0){
gNodes[node].childs[index] = gIndex++;
}
node = gNodes[node].childs[index]; }
gNodes[node].count++;
} int main(){
int n, m;
char card[4];
stack<Card> card_stack;
int suit, value;
Card car;
while (scanf("%d", &n) != EOF){
if (n == 0){
break;
}
memset(gNodes, 0, sizeof(gNodes));
gIndex = 2;
while (n--){
scanf("%d", &m);
getchar();
for (int i = 0; i < m; i++){
for (int k = 0; k < 3; k++){
scanf("%c", card + k);
}
if (*(card + 1) == '0'){
*(card + 3) = 0;
getchar();
}
else{
*(card + 2) = 0;
}
CardHash(card, car);
//printf("card = %s\n", card);
card_stack.push(car);
}
Insert(1, card_stack);
}
printf("%d\n", gIndex - 2);
}
return 0;
}

poj_3283 trie树的更多相关文章

  1. 基于trie树做一个ac自动机

    基于trie树做一个ac自动机 #!/usr/bin/python # -*- coding: utf-8 -*- class Node: def __init__(self): self.value ...

  2. 基于trie树的具有联想功能的文本编辑器

    之前的软件设计与开发实践课程中,自己构思的大作业题目.做的具有核心功能,但是还欠缺边边角角的小功能和持久化数据结构,先放出来,有机会一点点改.github:https://github.com/chu ...

  3. hihocoder-1014 Trie树

    hihocoder 1014 : Trie树 link: https://hihocoder.com/problemset/problem/1014 题意: 实现Trie树,实现对单词的快速统计. # ...

  4. 洛谷P2412 查单词 [trie树 RMQ]

    题目背景 滚粗了的HansBug在收拾旧英语书,然而他发现了什么奇妙的东西. 题目描述 udp2.T3如果遇到相同的字符串,输出后面的 蒟蒻HansBug在一本英语书里面找到了一个单词表,包含N个单词 ...

  5. 通过trie树实现单词自动补全

    /** * 实现单词补全功能 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #incl ...

  6. #1014 Trie树

    本题主要是求构造一棵Trie树,即词典树用于统计单词. C#代码如下: using System; using System.Collections.Generic; using System.Lin ...

  7. Trie树-字典查找

    描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一本词典,于是小Hi就向小Ho提出了那个经典的问题: ...

  8. Trie树的创建、插入、查询的实现

    原文:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=28977986&id=3807947 1.什么是Trie树 Tr ...

  9. Trie树(c++实现)

    转:http://www.cnblogs.com/kaituorensheng/p/3602155.html http://blog.csdn.net/insistgogo/article/detai ...

随机推荐

  1. C语言 · 贪心算法

    发现蓝桥杯上好多题目涉及到贪心,决定学一学. 贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择.也就是说:不从整体最优上考虑,而是在某种意义上的局部最优解.其关键是贪心策略的选择,选择的贪心 ...

  2. Log4j 2使用教程<转>

    Log4j 2的好处就不和大家说了,如果你搜了2,说明你对他已经有一定的了解,并且想用它,所以这里直接就上手了. 1. 去官方下载log4j 2,导入jar包,基本上你只需要导入下面两个jar包就可以 ...

  3. C#操作摄像头 实现拍照功能

    从正式工作以来一直做的都是基于B/S的Web开发,已经很长时间不研究C/S的东西了,但是受朋友的委托,帮他做一下拍照的这么个小功能.其实类似的代码网上有很多,但是真的能够拿来运行的估计也没几个.本来是 ...

  4. eclipse安装中文补丁包

    第一步:打开http://www.eclipse.org/babel/ 第二步:找到downloads. 第三步:点击Oxygen. 第四步:找到简体中文的zip插件并兵下载. 第五步:解压. 第六步 ...

  5. 用户数据验证的正确姿势之assert

    用户数据验证灰常重要, 不用多说了, 但是实现方法(准确的说是表现形式)有很多人, 如何优雅的完成一个后端验证过滤器是一个值得考量的问题, 我尝试过许多方法, 比如validator.js模块, ex ...

  6. Understand:高效代码静态分析神器详解(一)

    Understand:高效代码静态分析神器详解(一) Understand   之前用Windows系统,一直用source insight查看代码非常方便,但是年前换到mac下面,虽说很多东西都方便 ...

  7. BuddyPress创建组、查看成员信息等找不到页面

    BuddyPress创建组.查看成员信息等找不到页面 http://aoxuangame.com/wordpress/groups/create/ http://aoxuangame.com/word ...

  8. JS 播放列表收缩展开

    下面要做实现的效果 收缩和展的功能 遵循网页布局,行为,结构,样式 分离 下面是html 结构代码: <div id="drop" class="down_list ...

  9. HTC Desire 816 root教程和方法

    每个手机入手之后基本上都需要进行root,不root的话,手机里很多的无有软件都删除不了,咱们的HTC Desire 816也是一样的,也需要进行root才可以删除系统里自带的那些无用的软件,这些软件 ...

  10. Linux基础回想(1)——Linux系统概述

    1. 什么是操作系统?它与硬件以及其它软件之间的关系是如何的? 操作系统是控制和管理计算机系统内各种硬件和软件资源.有效组织多道程序执行的系统软件(或程序集合),是用户和计算机之间的接口.详细的说: ...