T9 poj 1451 hdu 1298

题意:就是让你模拟手机输入单词。具体就是给你一些单词,以及该单词被使用的频数,这个频数也是该单词前缀的使用频数,当然不同的单词有可能有相同的前缀,那么这个相同的前缀的使用频数就是这两个单词使用频数之和,以此类推。然后再给你一些数字串,让你针对该数字串的每一个前缀输出它的最有可能对应的单词(即频数最大的字符串)。

 

题解:字典树+深搜。对输入的字符串建立字典树每个节点中存储相应的前缀的使用频数。然后对输入的数字串枚举其每一个前缀在字典树中进行深度优先搜索,因为一个数字对应3-4个字母,因此深搜时就要枚举每一个对应的字母。

    

       一开始就是这样的想法,但觉得这样的方法很可能会超时。因为这种方法的查找效率很低,而建立字典树主要目的就是要减小查找的时间。所以后来就想如何才能降低查找的效率。题目最终输入的是一串数字,那么在建立字典树时......唉,考虑还不成熟,不写了,别再误导别人了。。。还是等想好再写下吧。

以下是参考别人的代码。。。囧啊。。。。

 

View Code
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 using namespace std;
 5 const int kind=26;
 6 const int N=105;
 7 struct TrieNode{
 8     int count;
 9     TrieNode *Next[kind];
10 }Memory[10000000];
11 TrieNode *Root=NULL;
12 int T,n,timenum,allcop,m,all,cas=1;
13 char str[N],ans[N],temp[N];
14 char num[10][5]={{"\0"},{"\0"},{"abc"},{"def"},{"ghi"},{"jkl"},{"mno"},{"pqrs"},{"tuv"},{"wxyz"}};
15 TrieNode *CreateTrie(){
16     TrieNode *p=&Memory[allcop++];
17     for(int i=0;i<kind;i++)
18         p->Next[i]=NULL;
19     p->count=0;
20     return p;
21 }
22 void Insert(){
23     TrieNode * p=Root;
24     int i=0,branch;
25     while(str[i]){
26         branch=str[i++]-'a';
27         if(!p->Next[branch])p->Next[branch]=CreateTrie();
28         p->Next[branch]->count+=timenum;
29         p=p->Next[branch];
30     }
31 }
32 void search(int pos,int end,TrieNode *root){
33     TrieNode *p=root;
34     int numpos=str[pos]-'0';
35     int len=strlen(num[numpos]);
36     for(int i=0;i<len;i++){
37         int branch=num[numpos][i]-'a';
38         if(!p->Next[branch])continue;
39         temp[pos]=num[numpos][i];
40         if(pos==end){
41             if(p->Next[branch]->count>all){
42                 all=p->Next[branch]->count;
43                 temp[pos+1]='\0';
44                 strcpy(ans,temp);
45             }
46         }
47         else search(pos+1,end,p->Next[branch]);
48     }
49 }
50 int main()
51 {
52     //freopen("in.txt","r",stdin);
53     scanf("%d",&T);
54     while(T--){
55         allcop=0;
56         Root=CreateTrie();
57         scanf("%d",&n);
58         while(n--){
59             scanf("%s %d",str,&timenum);
60             Insert();
61         }
62         scanf("%d",&m);
63         printf("Scenario #%d:\n", cas++);
64         while(m--){
65             scanf("%s",str);
66             for(int i=0;i<strlen(str)-1;i++){
67                 all=0;
68                 search(0,i,Root);
69                 if(all==0)printf("MANUALLY\n");
70                 else      printf("%s\n",ans);
71             }
72             printf("\n");
73         }
74         printf("\n");
75         
76     }
77     return 0;
78 }

 

 

posted on 2012-09-18 21:26  Acmer_Roney  阅读(234)  评论(0编辑  收藏  举报

导航