当前位置:编程学习 > C/C++ >>

HDU-4287-Intelligent IME

HDU-4287-Intelligent IME
 
http://acm.hdu.edu.cn/showproblem.php?pid=4287
 
开始用字典树+深搜,超时。。。。后来发现题目最多6位数,可将字符串转化成对应的数字,然后hash即可
 
TLE的代码
 
 
[cpp] 
#include<iostream>   
#include<cstdio>   
#include<cstring>   
#include<cstdlib>   
using namespace std;   
int n,m,ans; 
char map[5005][8]; 
char word[8]; 
char 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  num[8]={3,3,3,3,3,4,3,4}; 
struct node   
{   
    int count;   
    node *childs[26];    
    node()   
    {   
        count=0;   
        for(int i=0;i<26;i++)   
        childs[i]=NULL;   
    }   
};   
node *root;   
node *current,*newnode;  
void insert(char *str) //插入字符串   
{   
    int i,m;   
    current=root;   
    for(i=0;i<strlen(str);i++)   
    {   
        m=str[i]-'a';   
        if(current->childs[m]!=NULL)   
        current=current->childs[m];   
        else   
        {   
            newnode=new node;   
            current->childs[m]=newnode;   
            current=newnode;   
        }   
    }   
    current->count=1; 

int search(char *str)   //在字典树中查找一个单词是否存在   
{   
    int i,m;   
    current=root;   
    for(i=0;i<strlen(str);i++)   
    {   
        m=str[i]-'a';   
        if(current->childs[m]==NULL)   
        return 0;   
        current=current->childs[m];   
    }   
    return current->count;   
}   
void del(node *head)     
{   
    int i;   
    for(i=0;i<26;i++)   
    if(head->childs[i]!=NULL)    
    del(head->childs[i]);   
    delete(head);   

void dfs(char str[10],int len,int t) 

    int i,s; 
    if(t==len) 
    { 
        word[len]='\0'; 
        if(search(word)) 
        ans++; 
    } 
    s=num[str[t]-'2']; 
    for(i=0;i<s;i++) 
    { 
        word[t]=phone[str[t]-'2'][i]+'a'; 
        dfs(str,len,t+1); 
    } 

int main() 

    int t,i; 
    int len; 
    char temp[8]; 
    scanf("%d",&t); 
    while(t--) 
    { 
        scanf("%d%d",&n,&m); 
        for(i=0;i<n;i++) 
        scanf("%s",map[i]); 
        root=new node; 
        while(m--) 
        { 
            scanf("%s",temp); 
            insert(temp); 
        } 
        for(i=0;i<n;i++) 
        { 
            ans=0; 
            len=strlen(map[i]); 
            dfs(map[i],len,0); 
            printf("%d\n",ans); 
        } 
        del(root); 
    } 
    return 0; 

AC的代码
 
[cpp]
#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 
int hashh[1000005]; 
int a[5005]; 
char str[10]; 
int judge(char c) 

    if('a'<=c&&c<='c') 
    return 2; 
    else if('d'<=c&&c<='f') 
    return 3; 
    else if('g'<=c&&c<='i') 
    return 4; 
    else if('j'<=c&&c<='l') 
    return 5; 
    else if('m'<=c&&c<='o') 
    return 6; 
    else if('p'<=c&&c<='s') 
    return 7; 
    else if('t'<=c&&c<='v') 
    return 8; 
    else if('w'<=c&&c<='z') 
    return 9; 

int main() 

    int t; 
    int i,j,n,m,len,sum; 
    scanf("%d",&t); 
    while(
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,