智能T9英文输入法
(phone.pas/in/out)
Problem
某款新型手机为了方便用户,希望开发一种新的英文输入法.要求在输入英文的时候输入法不但能够做到自动联想,还能进行自动纠错.譬如用户希望输入hello这个单词,他应该输入43556,但是他不小心输入了46556.输入法发现词库中找不到任何匹配的单词, 于是尝试把6纠正为3,这便是纠错功能.现在需要你来开发这个输入法的核心部分. 给出词库和用户的输入,请你依次给出适合的单词.
2 A B C
3 D E F
4 G H I
5 J K L
6 M N O
7 P Q R S
8 T U V
9 W X Y Z
注意:1和0没有对应的字母,但是1和0也有可能出现.
Input
数据第一行是一个整数n(1<=n<=100),表示词库中的单词个数.
接下来n行每行是一个词库中的单词.单词只包含大写字母,长度不会超过10.不会出现两个相同的单词.
最后一行是一个数字串表示用户的输入.输入的长度不会超过10.
Output
测试数据的输出,包含四个部分.
首先输出完全符合输入的单词.
然后是根据联想得到的单词,即前缀部分完全符合输入的单词.
接下来输出纠正一个按键之后完全符合输入的单词.
然后是纠正一个按键之后联想得到的单词.
每部分如果有多个匹配,则按字典顺序输出.
保证不会出现无解情况.
Sample Input
6
BVUJMEE
MUTKOE
BTVLOE
ATVKEI
EVTJNJHF
OVVLMFAABC
288563
Sample Output
BTVLOE
BVUJMEE
MUTKOE
OVVLMFAABC
必须拿分的水题,因为我错了,排名自然就下去了。
只是题目意思没搞懂。不一定要先完全匹配,才来联想。即使找不到完全匹配,也要联想。
其余处理很简单。
#include <cstdio>
#include <cstdlib>
char str[110][20];
char src[20];
char str0[110][20];
long hash[26] = {2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,7,8,8,8,9,9,9,9};
inline void unmap(char& a)
{
a = hash[a-'A'];
}
int cmpr(const void* aa,const void* bb)
{
char* a = (char*) aa;
char* b = (char*) bb;
long l = a[0];
if (b[0] < l)
l = b[0];
for (long i=1;i<l+1;i++)
{
if (a[i] < b[i])
return -1;
if (a[i] > b[i])
return 1;
}
if (a[0] < b[0])
return -1;
if (a[0] > b[0])
return 1;
return 0;
}
int cmpr2(const char* a,const char* b)
{
long l = a[0];
if (b[0] < l)
l = b[0];
for (long i=1;i<l+1;i++)
{
if (a[i] < b[i])
return -1;
if (a[i] > b[i])
return 1;
}
return 0;
}
bool cmpr3(const char* a,const char* b)
{
long cnt = 0;
long l = a[0];
if (b[0] < l)
l = b[0];
for (long i=1;i<l+1;i++)
{
if (a[i] != b[i])
{
cnt ++;
if (cnt == 2)
return false;
}
}
return cnt == 1;
}
int main()
{
freopen("phone.in","r",stdin);
freopen("phone.out","w",stdout);
long n;
scanf("%ld",&n);
for (long i=1;i<n+1;i++)
{
scanf("%s",str0[i]+1);
while (str0[i][++str0[i][0]]);str0[i][0]--;
}
qsort(str0+1,n,sizeof str0[0],cmpr);
for (long i=1;i<n+1;i++)
{
for (long j=1;j<str0[i][0]+1;j++)
str[i][j] = hash[str0[i][j]-'A'];
str[i][0] = str0[i][0];
}
scanf("%s",src+1);
while (src[++src[0]])
src[src[0]] -= '0';
src[0]--;
for (long i=1;i<n+1;i++)
{
if (cmpr(str[i],src)==0)
{
printf("%s\n",str0[i]+1);
}
}
for (long j=1;j<n+1;++j)
{
if (cmpr2(str[j],src)==0 && str[j][0]!=src[0])
{
printf("%s\n",str0[j]+1);
}
}
for (long i=1;i<n+1;i++)
{
if (cmpr3(str[i],src) && str[i][0]==src[0])
{
printf("%s\n",str0[i]+1);
}
}
for (long j=1;j<n+1;++j)
{
if (cmpr3(str[j],src) && str[j][0]!=src[0])
{
printf("%s\n",str0[j]+1);
}
}
return 0;
}