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