hdu 1298 T9 字典树+DFS

来源:互联网 发布:sequoiadb巨杉数据库 编辑:程序博客网 时间:2024/06/05 09:04

开始我算法复杂度估计错误,纠结了很久,没想到直接深搜穷举。

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1298

#include <stdio.h>#include <stdlib.h>#include <string.h>#define maxn 30struct Trie{    Trie * next[maxn];    int v;};Trie * root;int phone[8][4]={{0,1,2},{3,4,5},{6,7,8},{9,10,11},{12,13,14},{15,16,17,18},{19,20,21},{22,23,24,25}};int re[8]={3,3,3,3,3,4,3,4};char en[105];char ans[105];int pp;void Init_Trie(){    root = (Trie *)malloc(sizeof(Trie));    for(int i=0;i<maxn;i++){        root -> next[i] = NULL;    }}void Add_Trie(int value,char * str){    Trie * p = root , * q;    for(int i=0;str[i]!='\0';i++){        int id = str[i] - 'a';        if(p->next[id]==NULL){            q = (Trie *)malloc(sizeof(Trie));            q -> v = value;            for(int j=0;j<maxn;j++){                q -> next[j] = NULL;            }            p -> next[id] = q;            p = p -> next[id];        }        else {            p = p -> next[id];            p->v +=value;        }    }}void dfs(Trie * p,char * a,int now,int len){    if(now==len)    {        if(pp<p->v)        {            pp=p->v;            for(int i=0;i<len;++i)            en[i]=ans[i];            en[len]=0;        }        return;    }    int t=a[now]-'2';    for(int i=0;i<re[t];i++)    {        int id=phone[t][i];        if(p->next[id]!=NULL)        {            ans[now]='a'+id;             dfs(p->next[id],a,now+1,len);        }    }   return;}void Del_Trie(Trie * p){    for(int i=0;i<maxn;i++){        if(p->next[i])Del_Trie(p->next[i]);    }    free(p);}void input(){    int T,t=1;    scanf("%d",&T);    while(T--){              printf("Scenario #%d:\n",t++);        Init_Trie();          int n;        scanf("%d",&n);        char a[105];        int value;        for(int i=0;i<n;i++){            scanf("%s %d",a,&value);            Add_Trie(value,a);        }        int m;        scanf("%d",&m);        for(int i=0;i<m;i++){            scanf("%s",a);            for(int j=1;j<strlen(a);j++){                pp = 0;                dfs(root,a,0,j);                if(pp){                    puts(en);                }                else                     puts("MANUALLY");            }            if(i<m-1){                puts("");            }        }        puts("");        puts("");        Del_Trie(root);    }}void File(){    freopen("a.in","r",stdin);    freopen("a.out","w",stdout);}int main(){    //File();    input();    return 0;}


0 0
原创粉丝点击