1. 程式人生 > >HDU 4287-Intelligent IME(哈希)

HDU 4287-Intelligent IME(哈希)

wan adding number ons eight 後來 bre match ted

Intelligent IME

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2479 Accepted Submission(s): 1212


Problem Description   We all use cell phone today. And we must be familiar with the intelligent English input method on the cell phone. To be specific, the number buttons may correspond to some English letters respectively, as shown below:
  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
  When we want to input the word “wing”, we press the button 9, 4, 6, 4, then the input method will choose from an embedded dictionary, all words matching the input number sequence, such as “wing”, “whoi”, “zhog”. Here comes our question, given a dictionary, how many words in it match some input number sequences?

Input   First is an integer T, indicating the number of test cases. Then T block follows, each of which is formatted like this:
  Two integer N (1 <= N <= 5000), M (1 <= M <= 5000), indicating the number of input number sequences and the number of words in the dictionary, respectively. Then comes N lines, each line contains a number sequence, consisting of no more than 6 digits. Then comes M lines, each line contains a letter string, consisting of no more than 6 lower letters. It is guaranteed that there are neither duplicated number sequences nor duplicated words.

Output   For each input block, output N integers, indicating how many words in the dictionary match the corresponding number sequence, each integer per line.

Sample Input
1
3 5
46
64448
74
go
in
night
might
gn

Sample Output
3
2
0  題意 :在手機鍵盤的背景下,給出一串數字,然後由這些數字能夠枚舉出一系列的字符串,然後給出一個字典,問這些字符串一共同擁有幾個在字典中,逆向思考一下。一開始我是考慮著由給出的數字枚舉出全部的可能的字符串然後在字典中一一查找,但時間復雜度太高了,後來看到題解才明確,字符串是能夠轉換成數字的。並且唯一相應,然後哈希一下就能夠了。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cctype>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <list>
#define L long long
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=1000020;
int n,m,num[maxn],h[maxn];
char phone[]="22233344455566677778889999";
char word[5010][7];
int Binary_search(int x)
{
	int mid,low=0,high=n-1;
	while(low<=high)
	{
		mid=(low+high)/2;
		if(num[mid]==x)
			return mid;
		else if(num[mid]>x)
			high=mid-1;
		else if(num[mid]<x)
			low=mid+1;
	}
	return -1;
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		memset(h,0,sizeof(h));
		scanf("%d%d",&n,&m);
		for(int i=0;i<n;i++)
			scanf("%d",num+i);
		for(int i=0;i<m;i++)
			scanf("%s",word[i]);
		vector <int> pos(num,num+n);
		sort(num,num+n);
		for(int i=0;i<m;i++)
		{
			int len=strlen(word[i]);
			int sum=0;
			for(int j=0;j<len;j++)
				sum=sum*10+(phone[word[i][j]-'a']-'0');
			int tem=Binary_search(sum);
		    if(tem!=-1)
				h[num[tem]]++;
		}
		for(int i=0;i<n;i++)
			printf("%d\n",h[pos[i]]);
	}
	return 0;
}

HDU 4287-Intelligent IME(哈希)