这个问题的解决方法是多种多样的。如本文所用,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解读的更多相关文章

  1. 字符串专题:map POJ 1002

    第一次用到是在‘校内赛总结’扫地那道题里面,大同小异 map<string,int>str 可以专用做做字符串的匹配之类的处理 string donser; str [donser]++ ...

  2. POJ 1002 487-3279

    A - 487-3279 Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit ...

  3. [POJ 1002] 487-3279 C++解题报告

        487-3279 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 228365   Accepted: 39826 D ...

  4. 开篇,UVA 755 && POJ 1002 487--3279 (Trie + DFS / sort)

    博客第一篇写在11月1号,果然die die die die die alone~ 一道不太难的题,白书里被放到排序这一节,半年前用快排A过一次,但是现在做的时候发现可以用字典树加深搜,于是乐呵呵的开 ...

  5. [POJ] #1002# 487-3279 : 桶排序/字典树(Trie树)/快速排序

    一. 题目 487-3279 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 274040   Accepted: 48891 ...

  6. poj 2513 Colored Sticks (trie 树)

    链接:poj 2513 题意:给定一些木棒.木棒两端都涂上颜色,不同木棒相接的一边必须是 同样的颜色.求能否将木棒首尾相接.连成一条直线. 分析:能够用欧拉路的思想来解,将木棒的每一端都看成一个结点 ...

  7. Poj 1002 487-3279(二叉搜索树)

    题目链接:http://poj.org/problem?id=1002 思路分析:先对输入字符进行处理,转换为标准形式:插入标准形式的电话号码到查找树中,若有相同号码计数器增加1,再中序遍历查找树. ...

  8. POJ 2001 Shortest Prefixes (Trie)

    题目链接:POJ 2001 Description A prefix of a string is a substring starting at the beginning of the given ...

  9. poj 2513 Colored Sticks trie树+欧拉图+并查集

    点击打开链接 Colored Sticks Time Limit: 5000MS   Memory Limit: 128000K Total Submissions: 27955   Accepted ...

随机推荐

  1. 积累的VC编程小技巧之工具提示

    1.用鼠标移动基于对话框的无标题栏程序的简单方法 void CVCTestDlg::OnLButtonDown(UINT nFlags, CPoint point) {    //一句话解决问题    ...

  2. Visual Studio 控件命名规范(很详细)

    VS 控件命名规范 Type Prefix Example Array arr arrShoppingList Boolean bln blnIsPostBack Byte byt bytPixelV ...

  3. 利用开源HTML5引擎lufylegend.js结合javascript实现的五子棋人机对弈

    前言     本文主要介绍利用开源引擎 lufylegend.js开发基于Html5的游戏--五子棋,主要叙述其详细开发过程. 游戏规则 玩过五子棋的都应该知道五子棋的规则,这里就简单介绍其规则. 1 ...

  4. vb6源码后台点击任意窗口指定坐标XY位置,支持FLASH和一般的游戏

    vb6源码后台点击任意窗口指定坐标XY位置,支持FLASH和一般的游戏,支持每个网页用不同的IP登陆,支持多线程自动点击 适合自动打怪,游戏练级,配合自动识图功能,自动验证码技术,可以实现更多功能. ...

  5. 模拟new实例化对象。

    使用new和字面量的的方法是两种主流创建对象的方法,两种最终都能达到同样的实例化的对象,本章主要围绕new关键字来实例化一个对象并且讲一个不使用new但是完全与new实例化对象相同的例子. 在使用ne ...

  6. Org-mode五分钟教程ZZZ - Kaka Abel的日志 - 网易博客

    Org-mode五分钟教程ZZZ - Kaka Abel的日志 - 网易博客 Org-mode五分钟教程ZZZ  

  7. 一个网友写的栈,问为啥不能迭代。具有__iter__ 和next方法的对象叫迭代器-七七巴巴黄页网

    一个网友写的栈,问为啥不能迭代.具有__iter__ 和next方法的对象叫迭代器-七七巴巴黄页网 一个网友写的栈,问为啥不能迭代.具有__iter__ 和next方法的对象叫迭代器 python视频 ...

  8. Android服务之PackageManagerService启动源码分析

    了解了Android系统的启动过程的读者应该知道,Android的所有Java服务都是通过SystemServer进程启动的,并且驻留在SystemServer进程中.SystemServer进程在启 ...

  9. 《转》Python多线程学习

    原地址:http://www.cnblogs.com/tqsummer/archive/2011/01/25/1944771.html 一.Python中的线程使用: Python中使用线程有两种方式 ...

  10. counting objects in class

    參考文献:pgno=1">http://www.drdobbs.com/cpp/counting-objects-in-c/184403484? pgno=1