【模拟】智能T9英文输入法

智能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;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值