字典树应用 - poj 1002

Description

Businesses like to have memorable telephone numbers. One way to make a telephone number memorable is to have it spell a memorable word or phrase. For example, you can call the University of Waterloo by dialing the memorable TUT-GLOP. Sometimes only part of the number is used to spell a word. When you get back to your hotel tonight you can order a pizza from Gino's by dialing 310-GINO. Another way to make a telephone number memorable is to group the digits in a memorable way. You could order your pizza from Pizza Hut by calling their ``three tens'' number 3-10-10-10.

The standard form of a telephone number is seven decimal digits with a hyphen between the third and fourth digits (e.g. 888-1200). The keypad of a phone supplies the mapping of letters to numbers, as follows:

A, B, and C map to 2

D, E, and F map to 3

G, H, and I map to 4

J, K, and L map to 5

M, N, and O map to 6

P, R, and S map to 7

T, U, and V map to 8

W, X, and Y map to 9

There is no mapping for Q or Z. Hyphens are not dialed, and can be added and removed as necessary. The standard form of TUT-GLOP is 888-4567, the standard form of 310-GINO is 310-4466, and the standard form of 3-10-10-10 is 310-1010.

Two telephone numbers are equivalent if they have the same standard form. (They dial the same number.)

Your company is compiling a directory of telephone numbers from local businesses. As part of the quality control process you want to check that no two (or more) businesses in the directory have the same telephone number.

Input

The input will consist of one case. The first line of the input specifies the number of telephone numbers in the directory (up to 100,000) as a positive integer alone on the line. The remaining lines list the telephone numbers in the directory, with each number alone on a line. Each telephone number consists of a string composed of decimal digits, uppercase letters (excluding Q and Z) and hyphens. Exactly seven of the characters in the string will be digits or letters.

Output

Generate a line of output for each telephone number that appears more than once in any form. The line should give the telephone number in standard form, followed by a space, followed by the number of times the telephone number appears in the directory. Arrange the output lines by telephone number in ascending lexicographical order. If there are no duplicates in the input print the line:

No duplicates.

Sample Input

12

4873279

ITS-EASY

888-4567

3-10-10-10

888-GLOP

TUT-GLOP

967-11-11

310-GINO

F101010

888-1200

-4-8-7-3-2-7-9-

487-3279

Sample Output

310-1010 2

487-3279 4

888-4567 3

代码如下:(没有过TLE,不知道哪里有问题了)


//数字树 - 字典树
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring> using namespace std;
bool findsolve = false; struct trie
{
bool isEnd;//标记结束
int cnt;//标记数量
trie * next[10];//标记下一个结点
trie()
{
isEnd = false;
cnt = 0;
for(int i = 0 ; i < 10; i++)
next[i] = NULL;
}
};
trie * root = new trie; void Insert(char * s)
{
int len = strlen(s);
// cout << len << endl;
trie *p = root, *nw;
for(int i = 6 ; i >= 0 ; i--)
{
if(p->next[s[i]-'0'] == NULL)
{
nw = new trie;
p->next[s[i]-'0'] = nw;
}
p = p->next[s[i]-'0'];
}
p->isEnd = true;
p->cnt++;
} void del(trie * root)
{
trie*p = root;
if(root == NULL)
return;
for(int i = 0 ; i < 10 ; i++)
{
if(p->next[i] != NULL)
{
del(p->next[i]);
}
}
delete root;
return;
} bool Search(char *s)
{
trie *p = root;
int len = strlen(s);
for(int i = 0; i < len ; i++)
{
if(p->next[s[i]-'0'] == NULL)
return false;
p = p->next[s[i]-'0'];
}
if(p->isEnd == true)
return true;
return 0;
}
//test:ok
int trans(char *s)
{
int x = 0;
int len = strlen(s);
for(int i = 0 ; i < len ; i++)
{
if(s[i] == '-')
continue;
x *= 10;
if(s[i] >= 'A' && s[i] <= 'Y')
x += (s[i]-'A'-(s[i]>'Q'))/3+2;
else if(s[i] >= '0' && s[i] <= '9')
x += s[i]-'0';
}
return x;
} void dfs(trie* p,int m,char phone[9])
{
if(p->isEnd == true)
{
if(p->cnt > 1)
{
for(int i = 1; i <= 7 ; i++)
{
if(i == 4)
printf("-");
printf("%c",phone[i]);
}
printf(" %d\n",p->cnt);
findsolve = true;
}
return ;
} for(int i = 0 ; i < 10 ; i++)
{
if(p->next[i] != NULL)
{
phone[m+1] = (char)(i+'0');
dfs(p->next[i],m+1,phone);
}
}
return ;
} int main()
{
char phone[100];
freopen("in.txt","r",stdin);
// cin.sync_with_stdio(false);
int n, num;
// cin >> n;
scanf("%d",&n);
char ch[100];
for(int i = 0 ; i < n; i++)
{
scanf("%s",ch);
num = trans(ch);
//test:ok
char ans[100];
int j = 0;
if(num == 0)
{
for(int i = 0 ; i <= 6; i++)
{
ans[i] = '0';
}
ans[7] = '\0';
Insert(ans);
}
else
{
while(num)
{
int a = num % 10;
ans[j++] = (char)(a+'0');
num /= 10;
}
ans[j] = '\0';
Insert(ans);//插入树中
}
}
dfs(root,0,phone);
if(!findsolve)
printf("No duplicates.\n");
return 0;
}

大佬代码:

#include <cstdio>
#include <algorithm>
using namespace std;
char s[31]; int Hash()
{
int sum=0;
for(int i=0,k=0;k<7;i++)
{
if(s[i]>='0'&&s[i]<='9')
{
sum*=10;k++;
sum+=(s[i]-'0');
}
else if(s[i]>='A'&&s[i]<'Z')
{
sum*=10;k++;
sum+=((s[i]-'A'-(s[i]>'Q'))/3+2);
}
}
return sum;
} int main()
{ int n;scanf("%d",&n);
int data[n];getchar();
for(int tmp=0;tmp<n;tmp++)
{
gets(s);
data[tmp]=Hash();
}
sort(data,data+n);
bool p=false;n--;
for(int i=0,num=1;i<n;i+=num=1)
{
while(data[i]==data[i+1])
{
num++;
i++;
}
if(num>1)
{
printf("%03d-%04d %d\n",data[i]/10000,data[i]%10000,num);
p=true;
}
}
if(!p)printf("No duplicates.\n");
return 0;
}

用map,哈希,字典树都可以解决,希望大佬能看出来我哪里有问题

字典树应用 - poj1002的更多相关文章

  1. poj1002 字典树+map+查询单词出现次数

    487-3279 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 309235   Accepted: 55223 Descr ...

  2. 萌新笔记——用KMP算法与Trie字典树实现屏蔽敏感词(UTF-8编码)

    前几天写好了字典,又刚好重温了KMP算法,恰逢遇到朋友吐槽最近被和谐的词越来越多了,于是突发奇想,想要自己实现一下敏感词屏蔽. 基本敏感词的屏蔽说起来很简单,只要把字符串中的敏感词替换成"* ...

  3. [LeetCode] Implement Trie (Prefix Tree) 实现字典树(前缀树)

    Implement a trie with insert, search, and startsWith methods. Note:You may assume that all inputs ar ...

  4. 字典树+博弈 CF 455B A Lot of Games(接龙游戏)

    题目链接 题意: A和B轮流在建造一个字,每次添加一个字符,要求是给定的n个串的某一个的前缀,不能添加字符的人输掉游戏,输掉的人先手下一轮的游戏.问A先手,经过k轮游戏,最后胜利的人是谁. 思路: 很 ...

  5. 萌新笔记——C++里创建 Trie字典树(中文词典)(一)(插入、遍历)

    萌新做词典第一篇,做得不好,还请指正,谢谢大佬! 写了一个词典,用到了Trie字典树. 写这个词典的目的,一个是为了压缩一些数据,另一个是为了尝试搜索提示,就像在谷歌搜索的时候,打出某个关键字,会提示 ...

  6. 山东第一届省赛1001 Phone Number(字典树)

    Phone Number Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 We know that if a phone numb ...

  7. 字典树 - A Poet Computer

    The ACM team is working on an AI project called (Eih Eye Three) that allows computers to write poems ...

  8. trie字典树详解及应用

    原文链接    http://www.cnblogs.com/freewater/archive/2012/09/11/2680480.html Trie树详解及其应用   一.知识简介        ...

  9. HDU1671 字典树

    Phone List Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

随机推荐

  1. DEV中gridview常用属性

    1.隐藏最上面的GroupPanel: gridView1.OptionsView.ShowGroupPanel=false; 2.得到当前选定记录某字段的值: sValue=Table.Rows[g ...

  2. EasyUI 的常见标签

    1. Resizable 属性 原理: 页面加载完毕后,EasyUI主文件会扫描页面上的每个标签,判断这些标签的class值是否以"easyui-"开头, 如果是,则拿到之后的部分 ...

  3. Fibonacci----poj3070(矩阵快速幂, 模板)

    题目链接:http://poj.org/problem?id=3070 . 就是斐波那契的另一种表示方法是矩阵的幂: 所以是矩阵快速幂:矩阵快速幂学习 #include <cstdio> ...

  4. mysql 约束条件 auto_increment 自动增长 清空表 自动增长情况

    清空表情况: mysql> delete from t20; Query OK, rows affected (0.00 sec) mysql> show create table t20 ...

  5. Swift学习——A Swift Tour 枚举和结构体

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/zhenyu5211314/article/details/28588095 Enumerations ...

  6. JavaScript Object.defineProperty()方法详解

    Object.defineProperty() 方法直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象. 语法 Object.defineProperty(obj, prop ...

  7. 【开发者笔记】归并排序过程呈现之java内置GUI表示

    在网上看到一个视频将各种排序用视频表示出来,配上音乐,挺好玩的样子,就算是不会编程的人看到也会觉得很舒服,碰巧我也正在写归并算法,于是就用java的GUI实现一个. 归并排序的时间复杂度是T(n)=O ...

  8. .globl分析

    Uboot中常看到.globl .globl _start _start: b reset .align .globl _TEXT_BASE _TEXT_BASE: .globl _start  /* ...

  9. Oracle DB 使用RMAN将数据库移植到ASM存储区

    1. 完全关闭数据库. 2. 关闭数据库并修改服务器参数文件,以使用Oracle Managed Files (OMF). 3. 编辑并执行以下RMAN 脚本: STARTUP NOMOUNT; RE ...

  10. (转)MFC中Doc,View,MainFrmae,App各指针的互相获取

    App是应用域,所有的域中的东西都可以通过全局函数访问到它. MainFrame是主框架,也基本可以用全局函数访问到. MainFrame下是若干个ChildFrame,ChildFrame中若干个V ...