您的位置:首页 > 其它

hdu-4287 Intelligent IME

2016-02-19 11:22 330 查看
思路:

AC了很爽。一开始看题的时候把要求的东西给搞反了,是用字母去找相应的数字出现次数。

只要用数字构建个Trie树,然后将每次输入进来的字母字符串给转换成数字,然后search一下就可以。

其中要注意end和id的灵活运用

AC代码:

#include <iostream>
#include <cstring>
using namespace std;

struct node
{
int e,id;
struct node* next[10];
};
node* root = new node();
char hashs[150];
char str[5007][10];
int ans[5007];

void init()
{
hashs['a']=hashs['b']=hashs['c']='2';
hashs['d']=hashs['e']=hashs['f']='3';
hashs['g']=hashs['h']=hashs['i']='4';
hashs['j']=hashs['k']=hashs['l']='5';
hashs['m']=hashs['n']=hashs['o']='6';
hashs['p']=hashs['q']=hashs['r']=hashs['s']='7';
hashs['t']=hashs['u']=hashs['v']='8';
hashs['w']=hashs['x']=hashs['y']=hashs['z']='9';
}

void insert(char* s,int mark)
{
node* p = root;
for(;*s!='\0';s++)
{
int n = *s-'0';
if(p->next
== NULL)
p->next
= new node();
p = p->next
;
}
p->e = 1;
p->id = mark;
}

void search(char* s)
{
node* p = root;
for(;*s!='\0';s++)
{
int n = *s-'0';
if(p->next
== NULL) return ;
p = p->next
;
}
if(p->e == 1) ans[p->id]++;
}

int main()
{
int i,j,k;
init();
int T;
cin>>T;
while(T--)
{
memset(ans,0,sizeof(ans));
int n,m;
cin>>n>>m;
for(i = 0;i < n;i++)
{
cin>>str[i];
insert(str[i],i);
}
char tmp[10];
for(j = 1;j <= m;j++)
{
cin>>tmp;
for(k = 0;k < strlen(tmp);k++)
tmp[k] = hashs[tmp[k]];
search(tmp);
}
for(i = 0;i < n;i++)
cout<<ans[i]<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: