namenum解题报告 —— icedream61 博客园(转载请注明出处)
------------------------------------------------------------------------------------------------------------------------------------------------
【题目】
  你有一个手机,键盘如下所示:
    2: A,B,C 5: J,K,L 8: T,U,V
    3: D,E,F 6: M,N,O 9: W,X,Y
    4: G,H,I 7: P,R,S
  你还有一本字典,就是本目录下的"dict.txt"。里面有许多英文字符串,一行一个,是按照字典序排好的。
  现在给你一个输入,是数字字符串。请你从字典中找到所有能与之匹配的英文字符串,一行一个,按照字典序输出,一个没有输出"NONE"。
  所谓匹配是指:按照手机键盘,你可以将两个串对应起来,并且长度相同。
【数据范围】
  数字串长度可能是1~12
  英文串不到5000个
【输入样例】
  4734
【输出样例】
  GREG
------------------------------------------------------------------------------------------------------------------------------------------------
【分析】
  没有难度。
------------------------------------------------------------------------------------------------------------------------------------------------
【总结】
  1.字典本身是按照字典序排好的,注意到这个,就不用对答案再排序了……(我就没看到,又写了个快排)
  2.题目没说字符串有多长,于是我用的string去规避这个问题,其实搞个比较大的char数组也是可以的。
  3.这题比较奇葩……有个dict.txt,在网页上给出链接了,但其内容很大。我不知道他想要我当做输入文件去读,还是直接存到代码里。
  当我用ifstream去读时,发现读不到,不知是不是我读错了。于是我把它写到了代码的初始化部分,代码瞬间变成了100K,USACO服务器真好……

------------------------------------------------------------------------------------------------------------------------------------------------

【代码】

1、namenum.cpp

 /*
ID: icedrea1
PROB: namenum
LANG: C++
*/ #include <iostream>
#include <fstream>
using namespace std; void qsort(string str[],int l,int r)
{
if(l>=r) return;
int i=l,j=r;
string x=str[(l+r)>>];
while(true)
{
while(str[i]<x) ++i;
while(str[j]>x) --j;
if(i>j) break;
swap(str[i],str[j]);
++i; --j;
}
qsort(str,l,j); qsort(str,i,r);
} bool same(string name,string num)
{
if(name.size()!=num.size()) return false;
for(int i=;i!=num.size();++i)
{
switch(num[i])
{
case '':
if(name[i]!='A' && name[i]!='B' && name[i]!='C') return false;
break;
case '':
if(name[i]!='D' && name[i]!='E' && name[i]!='F') return false;
break;
case '':
if(name[i]!='G' && name[i]!='H' && name[i]!='I') return false;
break;
case '':
if(name[i]!='J' && name[i]!='K' && name[i]!='L') return false;
break;
case '':
if(name[i]!='M' && name[i]!='N' && name[i]!='O') return false;
break;
case '':
if(name[i]!='P' && name[i]!='R' && name[i]!='S') return false;
break;
case '':
if(name[i]!='T' && name[i]!='U' && name[i]!='V') return false;
break;
case '':
if(name[i]!='W' && name[i]!='X' && name[i]!='Y') return false;
break;
}
}
return true;
} void init(string dict[]); int main()
{
ifstream in("namenum.in");
ofstream out("namenum.out"); int n,s=;
string num,r[],dict[]; getline(in,num); init(dict);
for(int i=;i!=s;++i)
{
if(same(dict[i],num)) r[++n]=dict[i];
} if(!n) out<<"NONE"<<endl;
else
{
qsort(r,,n);
for(int i=;i<=n;++i) out<<r[i]<<endl;
} in.close();
out.close();
return ;
} void init(string dict[])
{
// 用下面的代码生成
}

2、生成字典的代码

 #include <iostream>
#include <fstream>
using namespace std; int main()
{
ifstream in("dict.txt");
ofstream out("doc.txt"); string name;
for(int i=;getline(in,name);++i)
out<<"\tdict["<<i<<"]=\""<<name<<"\";"<<endl; in.close();
out.close();
return ;
}

USACO Section1.2 Name That Number 解题报告的更多相关文章

  1. USACO Section1.4 Mother's Milk 解题报告

    milk3解题报告 —— icedream61 博客园(转载请注明出处)---------------------------------------------------------------- ...

  2. USACO Section1.1 Friday the Thirteenth 解题报告

    friday解题报告 —— icedream61 博客园(转载请注明出处) -------------------------------------------------------------- ...

  3. USACO Section1.3 Ski Course Design 解题报告

    skidesign解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------ ...

  4. 【九度OJ】题目1040:Prime Number 解题报告

    [九度OJ]题目1040:Prime Number 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1040 题目描述: Ou ...

  5. 【LeetCode】Largest Number 解题报告

    [LeetCode]Largest Number 解题报告 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problems/largest-number/# ...

  6. 【LeetCode】306. Additive Number 解题报告(Python)

    [LeetCode]306. Additive Number 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http: ...

  7. 「USACO 1.3」 Name That Number 解题报告

    \(注意 该篇题解为本人较早时期写的题解 所以会很傻 直接能用map 以string为下标偏偏要绕弯儿 有时间改一改QAQ\) [USACO1.2]Name That Number 题目描述 在威斯康 ...

  8. USACO Section 1.2 Name That Number 解题报告

    题目 题目描述 在一个农场里面,每一头牛都有一个数字编号,但是现在这些牛不喜欢这种编号,它们想把这些数字编号转化成为可以接受的字母的形式.数字与字母的转换表如下: 2: A,B,C 5: J,K,L ...

  9. ACM Minimum Inversion Number 解题报告 -线段树

    C - Minimum Inversion Number Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d &a ...

随机推荐

  1. 5 - 文件I/O操作

    读写文件是最常见的IO操作.Python内置了读写文件的函数,用法和C是兼容的 写文件 #打开data.txt,创建一个实例f f = open('data.txt','w') #向文件中写内容 f. ...

  2. vs2008使用mysql链接错误

    原因是因为安装了64位的mysql,而开发工具室32位的,需要安装32位的开发库就可以了

  3. POJ-1422 Air Raid---二分图匹配&最小路径覆盖

    题目链接: https://vjudge.net/problem/POJ-1422 题目大意: 有n个点和m条有向边,现在要在点上放一些伞兵,然后伞兵沿着图走,直到不能走为止 每条边只能是一个伞兵走过 ...

  4. Nodejs事件监听模块

    nodejs里面是不存在浏览器里面都冒泡,捕获这些行为的,所以Nodejs实现了events这个模块,里面大多数的模块都集成了这个模块,所以events是node模块里面最重要都一个模块,他对外只暴露 ...

  5. Redis 命令学习

    每天不学习点新的东西,感觉就有点会被社会淘汰掉了.也许现在学习的知识会很快忘记,下次学习用到这个知识点的时候,再回来翻记录的笔记,我想这样会比从头再学,效率会高点吧. 闲话不多聊,回归正题.今天学习r ...

  6. mysql题目(二学年)

    1.哪些命令可以知道mysql安装的版本 mysqladmin --version mysql --version 2.关于mysql密码说法正确的是 初始化安装完毕后密码为空 3.进入或者打开数据库 ...

  7. 微信小程序开发踩坑与总结 -

    原文链接:https://segmentfault.com/a/1190000008516296 前段时间把公司小程序项目开发完成了,所以来写写自己开发过程中碰到的问题和解决方法,以及用到的提高效率的 ...

  8. leetcode第221题(最大正方形)的本地IDE实现及变形

    问题描述: 在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积.PS:本文也对只包含0的最大正方形面积进行了运算 示例: 输入: 1 0 1 0 0 1 0 1 1 1 ...

  9. poj_1320_Street Numbers

    A computer programmer lives in a street with houses numbered consecutively (from 1) down one side of ...

  10. gzip,bzip2,xz压缩工具

    gzip,bzip2,xz压缩工具====================== gzip压缩工具 示例:[root@aminglinux yasuo]# ls1.txt 2.txt 3.txt[roo ...