HDU - 1298——T9 (九宫格拼音模拟)

本文介绍了一种在手机上快速输入文本的方法——T9输入法。该方法通过预测用户可能要输入的单词来简化传统的多击输入过程。文章还提供了一个实现T9输入法的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A while ago it was quite cumbersome to create a message for the Short Message Service (SMS) on a mobile phone. This was because you only have nine keys and the alphabet has more than nine letters, so most characters could only be entered by pressing one key several times. For example, if you wanted to type "hello" you had to press key 4 twice, key 3 twice, key 5 three times, again key 5 three times, and finally key 6 three times. This procedure is very tedious and keeps many people from using the Short Message Service.

This led manufacturers of mobile phones to try and find an easier way to enter text on a mobile phone. The solution they developed is called T9 text input. The "9" in the name means that you can enter almost arbitrary words with just nine keys and without pressing them more than once per character. The idea of the solution is that you simply start typing the keys without repetition, and the software uses a built-in dictionary to look for the "most probable" word matching the input. For example, to enter "hello" you simply press keys 4, 3, 5, 5, and 6 once. Of course, this could also be the input for the word "gdjjm", but since this is no sensible English word, it can safely be ignored. By ruling out all other "improbable" solutions and only taking proper English words into account, this method can speed up writing of short messages considerably. Of course, if the word is not in the dictionary (like a name) then it has to be typed in manually using key repetition again.


Figure 8: The Number-keys of a mobile phone.


More precisely, with every character typed, the phone will show the most probable combination of characters it has found up to that point. Let us assume that the phone knows about the words "idea" and "hello", with "idea" occurring more often. Pressing the keys 4, 3, 5, 5, and 6, one after the other, the phone offers you "i", "id", then switches to "hel", "hell", and finally shows "hello".

Write an implementation of the T9 text input which offers the most probable character combination after every keystroke. The probability of a character combination is defined to be the sum of the probabilities of all words in the dictionary that begin with this character combination. For example, if the dictionary contains three words "hell", "hello", and "hellfire", the probability of the character combination "hell" is the sum of the probabilities of these words. If some combinations have the same probability, your program is to select the first one in alphabetic order. The user should also be able to type the beginning of words. For example, if the word "hello" is in the dictionary, the user can also enter the word "he" by pressing the keys 4 and 3 even if this word is not listed in the dictionary.
Input The first line contains the number of scenarios.

Each scenario begins with a line containing the number w of distinct words in the dictionary (0<=w<=1000). These words are given in the next w lines. (They are not guaranteed in ascending alphabetic order, although it's a dictionary.) Every line starts with the word which is a sequence of lowercase letters from the alphabet without whitespace, followed by a space and an integer p, 1<=p<=100, representing the probability of that word. No word will contain more than 100 letters.

Following the dictionary, there is a line containing a single integer m. Next follow m lines, each consisting of a sequence of at most 100 decimal digits 2-9, followed by a single 1 meaning "next word".
Output The output for each scenario begins with a line containing "Scenario #i:", where i is the number of the scenario starting at 1.

For every number sequence s of the scenario, print one line for every keystroke stored in s, except for the 1 at the end. In this line, print the most probable word prefix defined by the probabilities in the dictionary and the T9 selection rules explained above. Whenever none of the words in the dictionary match the given number sequence, print "MANUALLY" instead of a prefix.

Terminate the output for every number sequence with a blank line, and print an additional blank line at the end of every scenario.
Sample Input
2
5
hell 3
hello 4
idea 8
next 8
super 3
2
435561
43321
7
another 5
contest 6
follow 3
give 13
integer 6
new 14
program 4
5
77647261
6391
4681
26684371
77771
Sample Output
Scenario #1:
i
id
hel
hell
hello

i
id
ide
idea


Scenario #2:
p
pr
pro
prog
progr
progra
program

n
ne
new

g
in
int

c
co
con
cont
anoth
anothe
another

p
pr
MANUALLY
MANUALLY

题意:输入字符串优先级,输出数字串中对应九宫数字键的拼音优先级最高的,优先级相等按字典序。

思路:简单的字典树模拟题,放置好优先级,再搜索就行了。有个坑点wa了一天,一直RE,以为是内存超限,然后疯狂改代码,后来发现是因为它的输入中有1的情况存在,可题意写明是2—9,以1结尾。

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
char a[105],x,b[105],ans[105];
int ansp;
char pan[10][5]= {"","","abc#","def#","ghi#","jkl#","mno#","pqrs","tuv#","wxyz"};
struct Trie
{
    int v;
    Trie *next[26];
};
Trie root;
int  cteate_Trie(int x)
{
    Trie *p=&root,*q;
    int len=strlen(a);
    for(int i=0; i<len; i++)
    {
        int di=a[i]-'a';
        if(p->next[di]==NULL)
        {
            q=new Trie;
            for(int i=0; i<26; i++)
            {
                q->next[i]=NULL;
            }
            q->v=0;
            p->next[di]=q;
        }
        p=p->next[di];
        (p->v)+=x;
    }
}
int  find_Trie(Trie *heat,char *ttx,int l)
{
    if(l>105)
        return 0;
    if(b[l]=='\0')
    {
        if(ansp<heat->v)
        {
            ttx[l]='\0';
            ansp=heat->v;
            strcpy(ans,ttx);
            return 0;
        }
    }
    if(b[l]<'2'||b[l]>'9')//不加这个判断就直接RE
        return 0;
    int pi=b[l]-'0';
    for(int i=0; i<4; i++)
    {
        if(pan[pi][i]!='#')
        {
            int di=pan[pi][i]-'a';
            if(heat->next[di]!=NULL)
            {
                ttx[l]=pan[pi][i];
                find_Trie(heat->next[di],ttx,l+1);
            }
        }

    }
}
int main()
{
    char ttx[105];
    int t,n,m,ph=1;
    scanf("%d",&t);
    while(t--)
    {
        for(int i=0; i<26; i++)
        {
            root.next[i]=NULL;
        }
        root.v=0;
        scanf("%d",&n);
        while(n--)
        {
            scanf("%s%d",a,&x);
            cteate_Trie(x);
        }
        printf("Scenario #%d:\n",ph++);
        scanf("%d",&m);
        while(m--)
        {
            scanf("%s",a);
            int len=strlen(a);
            for(int i=1; i<len; i++)
            {
                memset(ttx,0,sizeof(ttx));
                ansp=0;
                strncpy(b,a,i);
                b[i]='\0';
                find_Trie(&root,ttx,0);
                if(ansp==0)
                    printf("MANUALLY\n");
                else
                    printf("%s\n",ans);
            }
            printf("\n");
        }
        printf("\n");
    }
    return 0;
}

独立完成项目-----T9输入法模拟器 本来这是老师给我们尖子小组三个人的一个合作挑战项目 但是我自己想了想 结构和原理按我的思路应该是可以行的通的 和他们俩住的远 也没得商量 思路上来就自己搞完了 项目名:手机T9输入法模拟器 参加人员:小枪 开发平台:window XP 开发工具:visual studio 2005 , sqlserver 2005 重点要点:全程数据库操作语句 全部采用 执行存储过程 模拟手机拼音输入法按键 如:2建代表 “abc” 贯彻三层结构数据理念 按不同的键组织成不同的拼音组合 再根据这些拼音组合查询数据库 列出所有符合按键拼音组合的汉字 这个地方相对我们在校的学生应该是比较有挑战的 总结思路 主要的思路构造就是全局做一个list将当前的所有能拼出来的拼音组合存起来 按下一个按键就把它全拆开挨个拼出新的组合 然后将全局的list再用我们新拼的组合来替换掉 替换前要记得清掉我们listviwe 里的所有字和拼音 我觉得难的地方在于那个返回键 也就是退格键 它要干的事就是返回我们的上一个步骤 这里我处理手段使用的是以前依稀记得的冒泡排序 和list的rmove 来挨个处理 先把前面按键组成的所有拼音组合挨个拿出来退一个字符 然后把第一个和所有集合中所有的拼音组合相比 有相同的就去掉 集合中原先第2个组合就成了现在的第一个组合 再把它拿出来挨个比较... 想了好久 靠 确实有点抽象了 说都有点说不明白 真不知道我们那班同学怎么去理解 字库问题 :还有就是字库的问题 据我所知汉字字库大概几千字 还是多少个来着 要做模拟器就得先做字库 这就有点麻烦了 一个一个的添显然麻烦 我偷了个懒 做俩个表 第一个表是我们的汉字表 包含两个字段: 汉字字符 和 我们的拼音外键 (因为一个拼音组合可能会有几十或上百的同音字) 第二个表就是我们的拼音表 这样查询的时候也简单 根据拼音父建直接可以查到这个拼音组合下所有的同音字 为了字库入库方便 我顺便还写了一个入库工具 呵呵 这个就比较简单了 输入流 把同一个拼音组合的汉字放一个文本中 然后把这个文本中这些汉字做成一个数组 加的时候等于说一次就加一个拼音组合的汉字 怎么样 思路还算可以吧 呵呵 字库未加完 我这里带上字库 自己加进去吧 呵呵这样应该可以交差了 在校学生: 小枪
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值