首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

关于一道ACM题,总是超时,请帮帮忙!解决方法

2012-01-18 
关于一道ACM题,总是超时,请帮帮忙!!487-3279TimeLimit:2000MSMemoryLimit:30000KTotalSubmit:49656Accepte

关于一道ACM题,总是超时,请帮帮忙!!
487-3279  
Time   Limit:2000MS     Memory   Limit:30000K
Total   Submit:49656   Accepted:8545  

Description
Businesses   like   to   have   memorable   telephone   numbers.   One   way   to   make   a   telephone   number   memorable   is   to   have   it   spell   a   memorable   word   or   phrase.   For   example,   you   can   call   the   University   of   Waterloo   by   dialing   the   memorable   TUT-GLOP.   Sometimes   only   part   of   the   number   is   used   to   spell   a   word.   When   you   get   back   to   your   hotel   tonight   you   can   order   a   pizza   from   Gino 's   by   dialing   310-GINO.   Another   way   to   make   a   telephone   number   memorable   is   to   group   the   digits   in   a   memorable   way.   You   could   order   your   pizza   from   Pizza   Hut   by   calling   their   ``three   tens ' '   number   3-10-10-10.  

The   standard   form   of   a   telephone   number   is   seven   decimal   digits   with   a   hyphen   between   the   third   and   fourth   digits   (e.g.   888-1200).   The   keypad   of   a   phone   supplies   the   mapping   of   letters   to   numbers,   as   follows:  

A,   B,   and   C   map   to   2  
D,   E,   and   F   map   to   3  
G,   H,   and   I   map   to   4  
J,   K,   and   L   map   to   5  
M,   N,   and   O   map   to   6  
P,   R,   and   S   map   to   7  
T,   U,   and   V   map   to   8  
W,   X,   and   Y   map   to   9  

There   is   no   mapping   for   Q   or   Z.   Hyphens   are   not   dialed,   and   can   be   added   and   removed   as   necessary.   The   standard   form   of   TUT-GLOP   is   888-4567,   the   standard   form   of   310-GINO   is   310-4466,   and   the   standard   form   of   3-10-10-10   is   310-1010.  

Two   telephone   numbers   are   equivalent   if   they   have   the   same   standard   form.   (They   dial   the   same   number.)  

Your   company   is   compiling   a   directory   of   telephone   numbers   from   local   businesses.   As   part   of   the   quality   control   process   you   want   to   check   that   no   two   (or   more)   businesses   in   the   directory   have   the   same   telephone   number.  


Input
The   input   will   consist   of   one   case.   The   first   line   of   the   input   specifies   the   number   of   telephone   numbers   in   the   directory   (up   to   100,000)   as   a   positive   integer   alone   on   the   line.   The   remaining   lines   list   the   telephone   numbers   in   the   directory,   with   each   number   alone   on   a   line.   Each   telephone   number   consists   of   a   string   composed   of   decimal   digits,   uppercase   letters   (excluding   Q   and   Z)   and   hyphens.   Exactly   seven   of   the   characters   in   the   string   will   be   digits   or   letters.  




Output
Generate   a   line   of   output   for   each   telephone   number   that   appears   more   than   once   in   any   form.   The   line   should   give   the   telephone   number   in   standard   form,   followed   by   a   space,   followed   by   the   number   of   times   the   telephone   number   appears   in   the   directory.   Arrange   the   output   lines   by   telephone   number   in   ascending   lexicographical   order.   If   there   are   no   duplicates   in   the   input   print   the   line:  

No   duplicates.  


Sample   Input


12
4873279
ITS-EASY
888-4567
3-10-10-10
888-GLOP
TUT-GLOP
967-11-11
310-GINO
F101010
888-1200
-4-8-7-3-2-7-9-
487-3279


Sample   Output


310-1010   2
487-3279   4
888-4567   3

我的解答:
public   class   Main{
        public   static   void   main(String[]   args){
                Scanner   s   =   new   Scanner(System.in);
                int   n   =   s.nextInt();
                String   sc;int[]   e   =   new   int[n];
                Set <String>   set   =   new   TreeSet <String> ();
                LinkedList <String>   v   =   new   LinkedList <String> ();
                for   (int   i   =   0;i   <   n;i++){
                        sc   =   s.next();
                        v.add(m(sc));
                }
              for   (int   h   =   0;h   <   v.size();h++){
                        for   (int   l   =   h+1;l   <   v.size();l++){
                                      if   (v.get(h).equals(v.get(l)))   {
                                              e[h]++;
                                              v.remove(l);
                                              l--;
                                      }
                        }
            }


            for   (int   h   =   0;h   <   v.size();h++){
                        if   (e[h]   >   0){
                                e[h]++;                              
                        set.add(v.get(h)+ "   "+String.valueOf(e[h]));
                        }  
            }
            if   (set.isEmpty())   System.out.println( "No   duplicatest. ");
            else{
            for   (String   element   :   set){
                          System.out.println(element);
                      }
            }  
        }                

        private   static   String   m(String   s)   {
              char[]   c   =   s.toCharArray();
              StringBuilder   sb   =   new   StringBuilder();
              for(char   element   :   c){
              switch(element){
              case   'A ':
              case   'B ':
              case   'C ':
              element   =   '2 ';break;
              case   'D ':
              case   'E ':
              case   'F ':
              element   =   '3 ';break;
              case   'G ':
              case   'H ':
              case   'I ':
              element   =   '4 ';break;
              case   'J ':case   'K ':case   'L ':
              element   =   '5 ';break;
              case   'M ':case   'N ':case   'O ':
              element   =   '6 ';break;
              case   'P ':case   'R ':case   'S ':
              element   =   '7 ';break;
              case   'T ':case   'U ':case   'V ':


              element   =   '8 ';break;
              case   'W ':case   'X ':case   'Y ':
              element   =   '9 ';break;
              }
              if   (element   ==   '- ')   continue;
              sb.append(element);
              }
              sb.insert(3,   '- ');
              return   sb.toString();
        }
  }

[解决办法]
太长了,帮顶一下先
[解决办法]
用这些测试数据,你这个程序的运算时间是多少?
[解决办法]
如果你觉得快,可能是由于使用集合的缘故,像 ACM 的题目,需要自己设计算法,应该不允许使用现成的类库的吧。
[解决办法]
这个好像做过,用C编的,算法不难的啊。

热点排行