码迷,mamicode.com
首页 > 其他好文 > 详细

hdu-4287 Intelligent IME

时间:2016-02-19 12:33:11      阅读:106      评论:0      收藏:0      [点我收藏+]

标签:

思路:

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[n] == NULL)
            p->next[n] = new node();
        p = p->next[n];
    }
    p->e = 1;
    p->id = mark;
}

void search(char* s)
{
    node* p = root;
    for(;*s!=\0;s++)
    {
        int n = *s-0;
        if(p->next[n] == NULL) return ;
        p = p->next[n];
    }
    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;
}

 

hdu-4287 Intelligent IME

标签:

原文地址:http://www.cnblogs.com/immortal-worm/p/5200353.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!