博客第一篇写在11月1号,果然die die die die die alone~

一道不太难的题,白书里被放到排序这一节,半年前用快排A过一次,但是现在做的时候发现可以用字典树加深搜,于是乐呵呵的开始敲了,后来被卡了两天,一直以为算法错了,最后发现是输出答案时忘了回溯,这问题之前没怎么注意过,也算不小的收获。

字典树A了之后换sort来写,没想到快排效率更高,时间减少了一半,在POJ上A了之后重新在UVA上提交,居然WA了,调试半个小时,发现是变长数组的问题,看来UVA上的编译器对c99的支持不太好。

虽然有点水题的感觉,但是收获不小:

1.DFS处理答案的时候要考虑是否回溯

2.更深理解哈希

3.VLA慎用

  487-3279 

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 first line of the input contains the number of datasets in the input. A blank line follows. The first line of each dataset 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. There's a blank line between datasets.

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.

Print a blank line between datasets.

Sample Input

1

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

UVA上的代码如下,POJ上的和UVA有点不同,是单组输入,但算法是一样的

 #include<stdio.h>
#include<stdlib.h>
#include<string.h> struct trie
{
struct trie * next[];
int count;
};
struct trie * ROOT = NULL;
char RULE[] = {'','','','','','','','','','','','','','','','','','','','','','','','','',''};
char BOX[];
int FLAG; void insert(char * s);
void dfs(struct trie * temp,int len);
int main(void)
{
int t,n,len;
char s[],number[]; scanf("%d",&t);
while(t --)
{
FLAG = ;
ROOT = (struct trie *)malloc(sizeof(struct trie));
for(int i = ;i < ;i ++)
ROOT -> next[i] = NULL;
ROOT -> count = ; scanf("%d",&n);
while(n --)
{
len = ; scanf("%s",s);
for(int i = ;s[i];i ++) //转化为纯数字形式
{
if(s[i] >= '' && s[i] <= '')
number[len ++] = s[i];
else if(s[i] >= 'A' && s[i] <= 'Z')
number[len ++] = RULE[s[i] - 'A'];
}
number[len] = '\0';
insert(number);
}
dfs(ROOT,);
if(FLAG)
puts("No duplicates.");
puts("");
} return ;
} void insert(char * s) //trie插入函数
{
struct trie * temp = ROOT; for(int i = ;s[i];i ++)
if(temp -> next[s[i] - ''])
temp = temp -> next[s[i] - ''];
else
{
temp -> next[s[i] - ''] = (struct trie *)malloc(sizeof(struct trie));
for(int j = ;j < ;j ++)
temp -> next[s[i] - ''] -> next[j] = NULL;
temp -> next[s[i] - ''] -> count = ; temp = temp -> next[s[i] - ''];
}
temp -> count ++; return ;
} void dfs(struct trie * temp,int len) //深搜输出
{
for(int i = ;i < ;i ++)
if(temp -> next[i])
{
BOX[len] = i + '';
len ++;
if(temp -> next[i] -> count >= )
{
FLAG = ;
BOX[len] = '\0';
for(int j = ;BOX[j];j ++)
{
if(j == )
putchar('-');
printf("%c",BOX[j]);
}
printf(" %d\n",temp -> next[i] -> count);
len --; //注意回溯 continue;
}
dfs(temp -> next[i],len);
len --;
} return ;
}

Trie + DFS

 #include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <algorithm>
using namespace std; int RULE[] = {,,,,,,,,,,,,,,,,,,,,,,,,,}; int main(void)
{
int * ans;
int t,n,sum,flag,times,count,i,j,k;
char temp[]; scanf("%d",&t);
while(t --)
{
count = ;
scanf("%d",&n); ans = (int *)malloc(sizeof(int) * n); //如果在UVA上用ans[n]的形式便会WA
while(n --)
{
scanf("%s",temp);
for(i = sum = ;temp[i];i ++) //转化为纯数字形式(哈希)
{
if(temp[i] >= '' && temp[i] <= '')
{
sum *= ;
sum += (temp[i] - '');
}
else if(temp[i] >= 'A' && temp[i] <= 'Z')
{
sum *= ;
sum += (RULE[temp[i] - 'A']);
}
}
ans[count ++] = sum;
}
sort(ans,ans + count); //全部存入数组后排序 for(i = flag = ;i < count - ;i ++)
{
times = ; while(ans[i] == ans[i + ])
{
times ++;
i ++;
}
if(times > )
{
flag = ;
printf("%03d-%04d %d\n",ans[i] / ,ans[i] % ,times); //除法:截去后n位 求余:计算出后n位
}
}
if(!flag)
puts("No duplicates.");
if(t)
puts("");
} return ;
}

sort

开篇,UVA 755 && POJ 1002 487--3279 (Trie + DFS / sort)的更多相关文章

  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. uva 11732 - strcmp() Anyone? 不错的Trie题

    题解:http://blog.csdn.net/u013480600/article/details/23122503 我的代码一直TLE,,,看了人家的之后,认为1.链式前向星比較好,2.*dept ...

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

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

  5. 括号序列问题 uva 1626 poj 1141【区间dp】

    首先考虑下面的问题:Code[VS] 3657 我们用以下规则定义一个合法的括号序列: (1)空序列是合法的 (2)假如S是一个合法的序列,则 (S) 和[S]都是合法的 (3)假如A 和 B 都是合 ...

  6. POJ 2378 Tree Cutting (DFS)

    题目链接:http://poj.org/problem?id=2378 一棵树,去掉一个点剩下的每棵子树节点数不超过n/2.问有哪些这样的点,并按照顺序输出. dfs回溯即可. //#pragma c ...

  7. bzoj 3439 Kpm的MC密码(Trie+dfs序+主席树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3439 [题意] 给定若干串,问一个串的作为其后缀的给定串集合中的第k小. [思路] 如 ...

  8. POJ 1321-棋盘问题(DFS 递归)

    POJ 1321-棋盘问题 K - DFS Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I6 ...

  9. UVA 1508 - Equipment 状态压缩 枚举子集 dfs

    UVA 1508 - Equipment 状态压缩 枚举子集 dfs ACM 题目地址:option=com_onlinejudge&Itemid=8&category=457& ...

随机推荐

  1. mysql max_allowed_packet错误

    mysql错误 max_allowed_packet 查看目前配置 show VARIABLES like '%max_allowed_packet%'; 修改: set global max_all ...

  2. [Sparrow OS 设计文档连载(一)] Introduction

  3. 基数排序详解以及java实现

    前言 基数排序(radix sort)又称桶排序(bucket sort),相对于常见的比较排序,基数排序是一种分配式排序,即通过将所有数字分配到应在的位置最后再覆盖到原数组完成排序的过程.我在上一篇 ...

  4. 读写锁:ReadWriteLock

    http://my.oschina.net/20076678/blog/173165   一.在JDK文档中关于读写锁的相关说明 ReadWriteLock 维护了一对相关的 锁 ,一个用于只读操作, ...

  5. 16.ARC

    Swift 使用自动引用计数(ARC)机制来跟踪和管理应用程序的内存.通常情况下,Swift 内存管理机制会一直起作用,我们无须自己来考虑内存的管理.ARC 会在类的实例不再被使用时,自动释放其占用的 ...

  6. 毕业设计--天气预报App

    9月中旬,开始动手做我的毕业设计了,之前一直在纠结做啥,后来想想,既然是做毕业设计,那就大胆地做点自己没接触过的东西吧.然后网上查找资料得知做天气预报需要用到开放的API,而且要用那种现在还在维护的, ...

  7. Android中全局Application的onCreate多次调用问题

    String processName = OsUtils.getProcessName(this, android.os.Process.myPid()); if (processName != nu ...

  8. uoj #9. 【UTR #1】vfk的数据 水题

    #9. [UTR #1]vfk的数据 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/9 Description ...

  9. Qt学习之自定义窗口部件

    自定义Qt窗口部件 实现一个十六进制的SpinBox,一般SpinBox只支持十进制整数,但是可以子类化方法实现该功能 需重新实现以下虚函数 virtual QString textFromValue ...

  10. phpmyadmi 上传大文件

    最近自己想通过phpmyadmin上传大的文件,找了很多方法都没搞定,今天特意静下心来,终于搞定了. 需求:将480M大小的sql文件通过phpmyadmin进行导入 1.首先修改php.ini文件, ...