字符串哈希- Intelligent IME - HDU - 4287
题意:
将
26
个
字
母
用
8
个
数
字
代
替
,
规
则
如
下
:
将26个字母用8个数字代替,规则如下:
将26个字母用8个数字代替,规则如下:
2
:
a
,
b
,
c
2 : a, b, c
2:a,b,c
3
:
d
,
e
,
f
3 : d, e, f
3:d,e,f
4
:
g
,
h
,
i
4 : g, h, i
4:g,h,i
5
:
j
,
k
,
l
5 : j, k, l
5:j,k,l
6
:
m
,
n
,
o
6 : m, n, o
6:m,n,o
7
:
p
,
q
,
r
,
s
7 : p, q, r, s
7:p,q,r,s
8
:
t
,
u
,
v
8 : t, u, v
8:t,u,v
9
:
w
,
x
,
y
,
z
9 : w, x, y, z
9:w,x,y,z
同
一
数
字
可
能
代
替
多
个
字
母
。
T
组
测
试
用
例
,
每
组
数
据
包
括
n
个
长
度
不
超
过
6
的
数
字
以
及
m
各
长
度
不
超
过
6
的
字
符
串
。
对
每
一
个
数
字
,
统
计
m
个
字
符
串
中
有
多
少
个
能
够
由
该
数
字
表
示
,
输
出
个
数
。
同一数字可能代替多个字母。\\ \ \\T组测试用例,每组数据包括n个长度不超过6的数字以及m各长度不超过6的字符串。\\对每一个数字,统计m个字符串中有多少个能够由该数字表示,输出个数。
同一数字可能代替多个字母。 T组测试用例,每组数据包括n个长度不超过6的数字以及m各长度不超过6的字符串。对每一个数字,统计m个字符串中有多少个能够由该数字表示,输出个数。
Sample Input:
1
3 5
46
64448
74
go
in
night
might
gn
Sample Output:
3
2
0
题解:
根
据
题
中
给
出
的
表
,
对
m
个
字
符
串
求
哈
希
值
,
统
计
每
一
个
哈
希
值
出
现
的
次
数
。
对
n
个
数
字
输
出
对
应
的
个
数
即
可
。
根据题中给出的表,对m个字符串求哈希值,统计每一个哈希值出现的次数。\\对n个数字输出对应的个数即可。
根据题中给出的表,对m个字符串求哈希值,统计每一个哈希值出现的次数。对n个数字输出对应的个数即可。
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
#include <map>
using namespace std;
const int N=5010;
int T,n,m;
int num[N];
string str;
int table[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};
map<int,int> M;
int main()
{
cin>>T;
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&num[i]);
M[num[i]]=0;
}
for(int i=0;i<m;i++)
{
cin>>str;
int tmp=0;
for(int i=0;i<str.size();i++)
tmp=tmp*10+table[str[i]-'a'];
M[tmp]++;
}
for(int i=1;i<=n;i++)
printf("%d\n",M[num[i]]);
}
return 0;
}