POJ 1002 487-3279 Trie解读
这个问题的解决方法是多种多样的。如本文所用,Trie为了解决这个问题。
它也可用于hash表。map等解决方案,由于输入是特定7数字,因此,你应该能够解决。
如本文所用,Trie不是非常快。最后,我主要是由于直接输出导线,遍历整个Trie速度相当慢。
思路:
1 使用insert函数建立Trie。主要添加一个叶子节点的信息。记录当前有多少个反复的字符串
2 遍历就是依据叶子节点的信息决定是否须要输出。
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std; const int ARR_SIZE = 10; struct Node
{
int n;
Node **alpha;
Node() : n(0)
{
alpha = new Node*[ARR_SIZE];
for (int i = 0; i < ARR_SIZE; i++) alpha[i] = NULL;
}
~Node()
{
for (int i = 0; i < ARR_SIZE; i++)
{
if (alpha[i]) delete alpha[i];
alpha[i] = NULL;
}
delete alpha;
alpha = NULL;
n = 0;
}
}; Node *Trie; void insertTrie(string &s)
{
Node *pCrawl = Trie;
for (unsigned i = 0; i < s.size(); i++)
{
int id = s[i] - '0';
if (pCrawl->alpha[id] == NULL)
{
pCrawl->alpha[id] = new Node;
}
pCrawl = pCrawl->alpha[id];
}
pCrawl->n++; //添加一个字符串数量
} inline char charToNum(char a)
{
switch (a)
{
case 'A': case 'B': case 'C':
return '2';
case 'D': case 'E': case 'F':
return '3';
case 'G': case 'H': case 'I':
return '4';
case 'J': case 'K': case 'L':
return '5';
case 'M': case 'N': case 'O':
return '6';
case 'P': case 'R': case 'S':
return '7';
case 'T': case 'U': case 'V':
return '8';
case 'W': case 'X': case 'Y':
return '9';
}
return char('9'+1); //There is no mapping for Q or Z.uppercase letters (excluding Q and Z)
} char lookUpTable[26]; void initLookUpTable()
{
for (int i = 0; i < 26; i++)
{
lookUpTable[i] = charToNum(char(i+'A'));
}
} void strToNum(string &s)
{
int j = -1;
for (unsigned i = 0; i < s.size(); i++)
{
if (s[i] != '-')
{
s[++j] = s[i];//错误:s[j++] = s[i];j已经变化,以下还是用j
if ('A' <= s[j] && s[j] <= 'Z')
{
s[j] = lookUpTable[s[j]-'A'];
}
}
}
s.resize(j+1);
} bool flag;
void printRepeat(Node *r, string &path)
{
if (r->n >= 1)
{
if (r->n == 1) return ;
flag = true;
unsigned i = 0;
for ( ; i < 3; i++) putchar(path[i]);
putchar('-');
for ( ; i < 7; i++) putchar(path[i]);
putchar(' ');
printf("%d\n", r->n);
return ;
}
for (int i = 0; i < ARR_SIZE; i++)//in ascending lexicographical order
{
path += char(i+'0');
if (r->alpha[i]) printRepeat(r->alpha[i], path);
path.erase(path.size()-1);
}
} int main()
{
initLookUpTable(); int N;
scanf("%d", &N);
getchar();
string s;
char chs[100];
Trie = new Node;
while (N--)
{
gets(chs);
s = chs;
strToNum(s);
insertTrie(s);
}
flag = false;
string path;
printRepeat(Trie, path);
if (!flag) puts("No duplicates.");
delete Trie;
return 0;
}
版权声明:笔者心脏靖。景空间地址:http://blog.csdn.net/kenden23/,可能不会在未经作者同意转载。
POJ 1002 487-3279 Trie解读的更多相关文章
- 字符串专题:map POJ 1002
第一次用到是在‘校内赛总结’扫地那道题里面,大同小异 map<string,int>str 可以专用做做字符串的匹配之类的处理 string donser; str [donser]++ ...
- POJ 1002 487-3279
A - 487-3279 Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit ...
- [POJ 1002] 487-3279 C++解题报告
487-3279 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 228365 Accepted: 39826 D ...
- 开篇,UVA 755 && POJ 1002 487--3279 (Trie + DFS / sort)
博客第一篇写在11月1号,果然die die die die die alone~ 一道不太难的题,白书里被放到排序这一节,半年前用快排A过一次,但是现在做的时候发现可以用字典树加深搜,于是乐呵呵的开 ...
- [POJ] #1002# 487-3279 : 桶排序/字典树(Trie树)/快速排序
一. 题目 487-3279 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 274040 Accepted: 48891 ...
- poj 2513 Colored Sticks (trie 树)
链接:poj 2513 题意:给定一些木棒.木棒两端都涂上颜色,不同木棒相接的一边必须是 同样的颜色.求能否将木棒首尾相接.连成一条直线. 分析:能够用欧拉路的思想来解,将木棒的每一端都看成一个结点 ...
- Poj 1002 487-3279(二叉搜索树)
题目链接:http://poj.org/problem?id=1002 思路分析:先对输入字符进行处理,转换为标准形式:插入标准形式的电话号码到查找树中,若有相同号码计数器增加1,再中序遍历查找树. ...
- POJ 2001 Shortest Prefixes (Trie)
题目链接:POJ 2001 Description A prefix of a string is a substring starting at the beginning of the given ...
- poj 2513 Colored Sticks trie树+欧拉图+并查集
点击打开链接 Colored Sticks Time Limit: 5000MS Memory Limit: 128000K Total Submissions: 27955 Accepted ...
随机推荐
- TControlStyle.csParentBackground的作用(附Delphi里的所有例子,待续)
Only applicable when Themes are enabled in applications on Windows XP. Causes the parent to draw its ...
- Linux下同时运行不同版本的qt程序
因项目需要,可能有不同版本的qt程序要运行到同一台机器上,本次实验是qt4.8.5和qt5.3.1开发的程序同时运行在同一台机器上,此机器可以不按照qt的任何版本,当然,两个版本开发的qt与机器的位数 ...
- 积累的VC编程小技巧之滚动条
1.设置滚动条的滚动大小 创建一个基于CScrollview的SDI Project(在第6步中选CScrollview) 若你已创建了,这步可以省略. 然后: 改为如 void CTestView: ...
- Android 服务类Service 的具体学习
上一篇说到了通知栏Notification,提起通知栏,不得让人想到Service以及BroadcastReceive,作为android的4大组建的2个重要成员,我们没少和它们打交道.它们能够在无形 ...
- linux下的块设备驱动(二)
上一章主要讲了请求队列的一系列问题.下面主要说一下请求函数.首先来说一下硬盘类块设备的请求函数. 请求函数可以在没有完成请求队列的中的所有请求的情况下就返回,也可以在一个请求都不完成的情况下就返回. ...
- Detours信息泄漏漏洞
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...
- 开源mp3播放器--madplay 编译和移植 简记
madplay是一款开源的mp3播放器. http://madplay.sourcearchive.com/ 下面简单记录一下madplay的编译与移植到ARM开发板上的过程 一.编译x86版本的ma ...
- 做一个牛XX的身份证号验证类(支持15位和18位)
原文:做一个牛XX的身份证号验证类(支持15位和18位) #region 是否合法的中国身份证号码 protected bool IsChineseID() { if (str.Length == 1 ...
- vim在编译器 . 命令(点命令)
时间:2014.06.28 地点:基地 -------------------------------------------------------------------------------- ...
- SCU 3132(博弈)
传送门:windy和水星 -- 水星游戏 1 题意:在一张由 n*m 的格子组成的棋盘上放着 k 个骑士每个骑士的位置为(xi,yi),表示第xi行,第yi列骑士如果当前位置为(x,y),一步可以走的 ...