题目大意

将一副牌进行编号,四种花色分别标记为'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. JS地毯式学习三

    1. 插件是一类特殊的程序 . 他可以扩展浏览器的功能 , 通过下载安装完成 . 比如 , 在线音乐.视频动画等等插件. // 检测非 IE 浏览器插件是否存在function hasPlugin(n ...

  2. write something

    今天是2013年7月8日了. 办公室里灯光很柔和,但是雨后的窗外让天空很亮,光线乘机也溜了进来. 偶尔想去联系某个人,点开了她的资料,进去了她的博客.看了这几年来为数不多不的几篇博客.可以看到一个人的 ...

  3. 【C#】Queue的简单试用

    新建一个WPF项目,测试C#的Queue类的简单使用. 前台准备两个按钮 MainWindow.xaml <StackPanel VerticalAlignment="Center&q ...

  4. netfiler/iptables

    一. 什么是netfilter netfilter is a set of hooks inside the Linux kernel that allows kernel modules to re ...

  5. [转]Python Web部署方式总结

    学过PHP的都了解,php的正式环境部署非常简单,改几个文件就OK,用FastCgi方式也是分分钟的事情.相比起来,Python在web应用上的部署就繁杂的多,主要是工具繁多,主流服务器支持不足,在了 ...

  6. find 下参数的关系默认是and 一个参数多个选项可以用 -or

    [root@ob2 mytmp]# find -type f -name "*.html" -or -name "*.txt"./02.html./aa.htm ...

  7. 一、VM8.0 + CentOS 6.5 连接网络

    VM8.0 + CentOS 6.5 连接网络

  8. mysql 创建新用户并添加权限

    1.添加用户 1.1 添加一个新用户: mysql>grant usage on *.* to " with grant option; 上面这种只支持mysql服务器本地登录. 1. ...

  9. php面试

    var_dump()的作用是什么,主要用来干什么?Thread safe 和 Non Thread Safe 有什么区别?(本人表示不会,从没看见过)用php 把 gbk 的编码的字符串转换成 utf ...

  10. dvi 中的内容居中

    text-align:right;  文本居中 line-height:35px;*垂直居中*