USACO 1.2 Name That Number

题目链接:http://ace.delos.com/usacoprob2?a=RqgnadOgSCH&S=namenum

题意很简单,就是把数字串转换成可能的字母串。
由于字典很小(<5000),字母串到数字串的映射是唯一的,反过来算很简单。
如果用回溯法算数字串到字母串的映射再在字典中折半查找,时间复杂度为O(3^12*log(5000)),肯定会超时。

代码如下:
#include <iostream>
#include 
<fstream>
#include 
<string>
#include 
<vector>

using namespace std;

ifstream fin(
"namenum.in");
ofstream fout(
"namenum.out");

#ifdef _DEBUG
#define out cout
#define in cin
#else
#define out fout
#define in fin
#endif

//将字母映射到数字,不存在的为-1
int map[] = {2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,-1,7,7,8,8,8,9,9,9,-1};

void solve()
{
   
string object;
   
in>>object;
    
   
int len;
   len 
= object.size();

   fstream dict_in(
"dict.txt");
   vector
<string> dict;

   
string temp;

   
while( dict_in>>temp ){
       
if(temp.size()==len){
           
//只取等于数字串相等的字符串
           dict.push_back(temp);
       }
   }

   
//sort(dict.begin(),dict.end());
   
//dict.txt文件已经排好序,无需排序了.

   
bool find = false;
   
bool has_result = false;

   
for(int i=0;i<dict.size();++i){
       find 
= true;
       
for(int j=0;j<len;++j){
           
if(map[dict[i][j]-'A']!=object[j]-'0'){
               find 
= false;
               
break;
           }
       }

       
if(find){
           
out<<dict[i]<<endl;
           has_result 
= true;
       }
   }

   
if(!has_result)
       
out<<"NONE"<<endl;
}


int main(int argc,char *argv[])
{
  solve(); 
  
return 0;
}


posted on 2009-06-05 13:36 YZY 阅读(1251) 评论(0)  编辑 收藏 引用 所属分类: AlgorithmUSACO


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


导航

<2009年6月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

统计

常用链接

留言簿(2)

随笔分类

随笔档案

搜索

积分与排名

最新评论

阅读排行榜