zoukankan      html  css  js  c++  java
  • 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<<"	dict["<<i<<"]=""<<name<<"";"<<endl;
    13 
    14     in.close();
    15     out.close();
    16     return 0;
    17 }
  • 相关阅读:
    [BZOJ1578] [Usaco2009 Feb]Stock Market 股票市场(DP)
    [BZOJ1576] [Usaco2009 Jan]安全路经Travel(堆优化dijk + (并查集 || 树剖))
    [BZOJ1575] [Usaco2009 Jan]气象牛Baric(DP)
    [BZOJ1574] [Usaco2009 Jan]地震损坏Damage(贪心 + dfs)
    [BZOJ1572] [Usaco2009 Open]工作安排Job(贪心 + 堆)
    [luoguP2862] [USACO06JAN]把牛Corral the Cows(二分 + 乱搞)
    [luoguP3668] [USACO17OPEN]Modern Art 2 现代艺术2(栈)
    [luoguP3608] [USACO17JAN]Balanced Photo平衡的照片(树状数组 + 离散化)
    [luoguP3110] [USACO14DEC]驮运Piggy Back(SPFA || BFS)
    [BZOJ2342] [Shoi2011]双倍回文(manacher)
  • 原文地址:https://www.cnblogs.com/icedream61/p/4321420.html
Copyright © 2011-2022 走看看