poj_3283 trie树
题目大意
将一副牌进行编号,四种花色分别标记为'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树的更多相关文章
- 基于trie树做一个ac自动机
基于trie树做一个ac自动机 #!/usr/bin/python # -*- coding: utf-8 -*- class Node: def __init__(self): self.value ...
- 基于trie树的具有联想功能的文本编辑器
之前的软件设计与开发实践课程中,自己构思的大作业题目.做的具有核心功能,但是还欠缺边边角角的小功能和持久化数据结构,先放出来,有机会一点点改.github:https://github.com/chu ...
- hihocoder-1014 Trie树
hihocoder 1014 : Trie树 link: https://hihocoder.com/problemset/problem/1014 题意: 实现Trie树,实现对单词的快速统计. # ...
- 洛谷P2412 查单词 [trie树 RMQ]
题目背景 滚粗了的HansBug在收拾旧英语书,然而他发现了什么奇妙的东西. 题目描述 udp2.T3如果遇到相同的字符串,输出后面的 蒟蒻HansBug在一本英语书里面找到了一个单词表,包含N个单词 ...
- 通过trie树实现单词自动补全
/** * 实现单词补全功能 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #incl ...
- #1014 Trie树
本题主要是求构造一棵Trie树,即词典树用于统计单词. C#代码如下: using System; using System.Collections.Generic; using System.Lin ...
- Trie树-字典查找
描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一本词典,于是小Hi就向小Ho提出了那个经典的问题: ...
- Trie树的创建、插入、查询的实现
原文:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=28977986&id=3807947 1.什么是Trie树 Tr ...
- Trie树(c++实现)
转:http://www.cnblogs.com/kaituorensheng/p/3602155.html http://blog.csdn.net/insistgogo/article/detai ...
随机推荐
- CKFinder 自定义文件路径扩展ConfigurationPathBuilder
CKFinder 自定义文件路径扩展ConfigurationPathBuilder 打开config.xml当中可以看到如下配置 <basePathBuilderImpl>com.ckf ...
- javascript 图片滚动
<div style="width:9999px;"> <ul id="marquePic1_1"> <li> <dl ...
- Entity Framework应用:使用Code First模式管理数据库创建和填充种子数据
一.管理数据库连接 1.使用配置文件管理连接之约定 在数据库上下文类中,如果我们只继承了无参数的DbContext,并且在配置文件中创建了和数据库上下文类同名的连接字符串,那么EF会使用该连接字符串自 ...
- Python time & datetime & string 相互转换
#!/usr/bin/env python# -*- coding:utf-8 -*- # @Datetime : 2017/11/23 下午12:37# @Author : Alfred Xue# ...
- Mac中Java 配置maven及阿里云镜像
一:配置maven 1.下载maven,选择Binary tar.gz,解压拷贝到目录/usr/local/ 1 https://maven.apache.org/download.cgi 2.配置系 ...
- FATAL ERROR: Could not find ./bin/my_print_defaults 解决方法
FATAL ERROR: Could not find ./bin/my_print_defaults If you compiled from source, you need to run 'ma ...
- Namenode HA原理详解
社区hadoop2.2.0 release版本开始支持NameNode的HA,本文将详细描述NameNode HA内部的设计与实现. 为什么要Namenode HA? 1. NameNode High ...
- mssql占用80端口解决办法
services.msc
- 关于Unity的入门游戏飞机大战的开发(上)
每个组件都是一个类的实例,要获得某个组件,要先创建一个同类型的组件类实例,然后把实例传引用过去,就可以对想要的组件实例进行操作. 做游戏一般创建一个逻辑节点,里面只管逻辑,再创建一个动画节点,里面有好 ...
- webBrowser1.Document.Cookie取不到HttpOnly的Cookie,取Cookie不完整【转】
在做数据采集时,有些网站需要输入验证码,但各网站验证码都不同,不可能有完美的识别验证码的代码,所以我也没去研究,我所采取的方案是:在winform里通过WebBrowser调用网页先手动登录系统,然后 ...