USACO Section1.2 Name That Number 解题报告
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 解题报告的更多相关文章
- USACO Section1.4 Mother's Milk 解题报告
milk3解题报告 —— icedream61 博客园(转载请注明出处)---------------------------------------------------------------- ...
- USACO Section1.1 Friday the Thirteenth 解题报告
friday解题报告 —— icedream61 博客园(转载请注明出处) -------------------------------------------------------------- ...
- USACO Section1.3 Ski Course Design 解题报告
skidesign解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------ ...
- 【九度OJ】题目1040:Prime Number 解题报告
[九度OJ]题目1040:Prime Number 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1040 题目描述: Ou ...
- 【LeetCode】Largest Number 解题报告
[LeetCode]Largest Number 解题报告 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problems/largest-number/# ...
- 【LeetCode】306. Additive Number 解题报告(Python)
[LeetCode]306. Additive Number 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http: ...
- 「USACO 1.3」 Name That Number 解题报告
\(注意 该篇题解为本人较早时期写的题解 所以会很傻 直接能用map 以string为下标偏偏要绕弯儿 有时间改一改QAQ\) [USACO1.2]Name That Number 题目描述 在威斯康 ...
- USACO Section 1.2 Name That Number 解题报告
题目 题目描述 在一个农场里面,每一头牛都有一个数字编号,但是现在这些牛不喜欢这种编号,它们想把这些数字编号转化成为可以接受的字母的形式.数字与字母的转换表如下: 2: A,B,C 5: J,K,L ...
- ACM Minimum Inversion Number 解题报告 -线段树
C - Minimum Inversion Number Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d &a ...
随机推荐
- 增量数据同步中间件DataLink分享(已开源)
项目介绍 名称: DataLink['deitə liŋk]译意: 数据链路,数据(自动)传输器语言: 纯java开发(JDK1.8+)定位: 满足各种异构数据源之间的实时增量同步,一个分布式.可扩展 ...
- IOS笔记 : 一些小技巧
计算单元格高度,在自定义cell中 -(void) resizeTheHeight{ CGFloat contentWidth = 280; UIFont *font = [UIFont fontWi ...
- 1.6 NBU Catalog备份还原
用户的数据保存到了磁盘或者磁带中,并且是安全的,NBU所在的机器还有可能发生故障,需要重新安装或者将NBU部署到其他的机器中继续使用. 在这种情况下,如何让NBU知道用户已经存在的备份策略和存储单元配 ...
- ceph-文件存储
文件存储 ceph文件系统提供了任何大小的符合posix标准的分布式文件系统,它使用Ceph RADOS存储数据.要实现ceph文件系统,需要一个正在运行的ceph存储集群和至少一个ceph元数据服务 ...
- MongoDB在MFC下使用C++驱动编译错误的解决
.post p{text-indent: 2em;} 今天使用MongoDB的C++驱动,在编译连接的时候一直出现错误,显示的string_data.h下93行max宏的问题,可视其本身并不是调用ma ...
- .svn文件被删除的解决办法
不小心把文件夹下的.svn给删除了,svn提交时会报如下错误: 包含工作副本管理数据的目录“/home/usa/svn/aispeech/air201102/branches/tools/res/di ...
- 一步步做程序优化-讲一个用于OpenACC优化的程序(转载)
一步步做程序优化[1]讲一个用于OpenACC优化的程序 分析下A,B,C为三个矩阵,A为m*n维,B为n*k维,C为m*k维,用A和B来计算C,计算方法是:C = alpha*A*B + beta* ...
- java后台导出pdf
新页面打开wpf @RequestMapping("/showPdf") public String getpic( HttpServletRequest request, Htt ...
- mariadb源码编译安装及多实例
准备文件源文件/app/mariadb-10.2.12.tar.gz cd /app/ tar xf mariadb-10.2.12.tar.gz cd mariadb-10.2.12 mkdir ...
- spring-bean(全生命周期)
作用:在初始化和销毁bean时候,做一些处理工作是调用生命周期方法 格式: <bean id=”该生命周期的名称” class=”提供方法的类的全路径” init-methood=”init” ...