【USACO 1.2】Name That Number 题解

题目 Click Here (洛谷) Click Here (USACO) 
这是将名字转换位数字编码(注意int存不下,要用long long以上),然后用map(I LOVE STL)存储用这个数字可得到的名字。 
洛谷版(或其他用标准输入输出的OJ)代码详见:https://www.luogu.org/record/show?rid=7670169(如无账号、查看不了,请见最底部)


dict.txt


这里是USACO里提交通过的代码

 1 /*
 2 ID:louhanc1
 3 LANG:C++
 4 TASK:namenum
 5 */
 6 //USACO要求的格式,不必管它
 7 #include<cstdio>
 8 #include<cctype>
 9 #include<cstring>
10 #include<algorithm>
11 #include<cmath>
12 #include<queue>
13 #include<string>
14 #include<stack>
15 #include<iostream>
16 #include<vector>
17 #include<cstdlib>
18 #include<map>
19 using namespace std;
20 #define K 103
21 #define ULL unsigned long long
22 
23 inline ULL read(){//没有负数,就把flag去掉了(实际上是懒)
24     ULL ans(0); char t(getchar());
25     while( !isdigit(t) ) t = getchar();
26     while( isdigit(t) ){
27         ans = ans * 10 + ( t ^ '0' );
28         t = getchar();
29     }
30     return ans;
31 }
32 
33 int key[]={0,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,0,7,7,8,8,8,9,9,9,0};
34 //key是每个字符转化成的数字
35 map<ULL, vector<string> > f;//因为可得到的名字不止一个,所以用vector
36 ULL N;
37 string name;
38 int ans;
39 vector<string> tmp;//因为map每次访问f[N]都要一定的时间,所以把结果先存起来
40 
41 int main(){
42     freopen( "dict.txt", "r", stdin );//USACO里在编译环境中给了dict.txt 但在洛谷中直接附在便准输入输出后面
43     while( cin >> name ){
44         ULL t(0);
45         for ( int i = 0; i < name.size(); ++i )
46             t = t * 10 + key[name[i] - 'A' + 1];//转换成数字
47         f[t].push_back(name);//name能由t转换而来,进f[t]
48     }
49     freopen( "namenum.in", "r", stdin );
50     freopen( "namenum.out", "w", stdout );
51     N = read();
52     tmp = f[N];
53     if ( !tmp.size() ) printf( "NONE\n" );//没有满足的名字
54     for ( int i = 0; i < tmp.size(); ++i ) cout << tmp[i] << '\n';
55     return 0;
56 }
57 //finished on 2018/6/3
58 //at 14:48
 1 #include<cstdio>
 2 #include<cctype>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<queue>
 7 #include<string>
 8 #include<stack>
 9 #include<iostream>
10 #include<vector>
11 #include<cstdlib>
12 #include<map>
13 using namespace std;
14 #define K 103
15 #define ULL unsigned long long
16 
17 inline ULL read(){
18     ULL ans(0); char t(getchar());
19     while( !isdigit(t) ) t = getchar();
20     while( isdigit(t) ){
21         ans = ans * 10 + ( t ^ '0' );
22         t = getchar();
23     }
24     return ans;
25 }
26 
27 int key[]={0,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,0,7,7,8,8,8,9,9,9,0};
28 map<ULL, vector<string> > f;
29 ULL N;
30 string name;
31 int ans;
32 vector<string> tmp;
33 
34 int main(){
35     N = read();
36     while( cin >> name ){
37         ULL t(0);
38         for ( int i = 0; i < name.size(); ++i )
39             t = t * 10 + key[name[i] - 'A' + 1];
40         f[t].push_back(name);
41     }
42     if ( !f[N].size() ) printf( "NONE\n" );
43     tmp = f[N];
44     for ( int i = 0; i < tmp.size(); ++i ) cout << tmp[i] << '\n';
45     return 0;
46 }

猜你喜欢

转载自www.cnblogs.com/louhancheng/p/9245226.html