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

 1 /*
 2 ID: icedrea1
 3 PROB: namenum
 4 LANG: C++
 5 */
 6 
 7 #include <iostream>
 8 #include <fstream>
 9 using namespace std;
10 
11 void qsort(string str[],int l,int r)
12 {
13     if(l>=r) return;
14     int i=l,j=r;
15     string x=str[(l+r)>>1];
16     while(true)
17     {
18         while(str[i]<x) ++i;
19         while(str[j]>x) --j;
20         if(i>j) break;
21         swap(str[i],str[j]);
22         ++i; --j;
23     }
24     qsort(str,l,j); qsort(str,i,r);
25 }
26 
27 bool same(string name,string num)
28 {
29     if(name.size()!=num.size()) return false;
30     for(int i=0;i!=num.size();++i)
31     {
32         switch(num[i])
33         {
34             case '2':
35                 if(name[i]!='A' && name[i]!='B' && name[i]!='C') return false;
36                 break;
37             case '3':
38                 if(name[i]!='D' && name[i]!='E' && name[i]!='F') return false;
39                 break;
40             case '4':
41                 if(name[i]!='G' && name[i]!='H' && name[i]!='I') return false;
42                 break;
43             case '5':
44                 if(name[i]!='J' && name[i]!='K' && name[i]!='L') return false;
45                 break;
46             case '6':
47                 if(name[i]!='M' && name[i]!='N' && name[i]!='O') return false;
48                 break;
49             case '7':
50                 if(name[i]!='P' && name[i]!='R' && name[i]!='S') return false;
51                 break;
52             case '8':
53                 if(name[i]!='T' && name[i]!='U' && name[i]!='V') return false;
54                 break;
55             case '9':
56                 if(name[i]!='W' && name[i]!='X' && name[i]!='Y') return false;
57                 break;
58         }
59     }
60     return true;
61 }
62 
63 void init(string dict[]);
64 
65 int main()
66 {
67     ifstream in("namenum.in");
68     ofstream out("namenum.out");
69 
70     int n,s=4617;
71     string num,r[5000],dict[5000];
72 
73     getline(in,num); init(dict);
74     for(int i=0;i!=s;++i)
75     {
76         if(same(dict[i],num)) r[++n]=dict[i];
77     }
78 
79     if(!n) out<<"NONE"<<endl;
80     else
81     {
82         qsort(r,1,n);
83         for(int i=1;i<=n;++i) out<<r[i]<<endl;
84     }
85 
86     in.close();
87     out.close();
88     return 0;
89 }
90 
91 void init(string dict[])
92 {
93     // 用下面的代码生成
94 }

 

2、生成字典的代码

 1 #include <iostream>
 2 #include <fstream>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     ifstream in("dict.txt");
 8     ofstream out("doc.txt");
 9 
10     string name;
11     for(int i=0;getline(in,name);++i)
12         out<<"\tdict["<<i<<"]=\""<<name<<"\";"<<endl;
13 
14     in.close();
15     out.close();
16     return 0;
17 }

 

posted on 2015-03-08 23:26  IceDream61  阅读(186)  评论(0编辑  收藏  举报

导航