2012天津赛区网络赛 - 1010 - Intelligent IME - HDU - 4287

/*一开始用暴力解决,果断TLE,然后想着建立一棵搜索树即可,一开始因为DEVC的原因,
调试时开的是另外一个程序,我竟然没发现,没处理好指针,RE了很多次
后来又没注意到7:p,q,r,s WA了一次,改了后终于AC了,耗时3小时。。。 */
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int N,M;
char number[5001][10],dict[5001][10];  
typedef struct node{
    int num;
    struct node *cl[10];
}Tree; 
Tree *stack[1500];  
int BuildTree(Tree *pa,int cur,char a[])
{
    int i;
    if(cur==strlen(a))
    {
        pa->num++;
        return 0;
    } 
    if(pa->cl[a[cur]-'0']==NULL)
    {
        pa->cl[a[cur]-'0']=(Tree *)malloc(sizeof(Tree));
        pa=pa->cl[a[cur]-'0'];
        for(i=0;i<10;i++)pa->cl[i]=NULL;
        pa->num=0;
    }    
    else pa=pa->cl[a[cur]-'0'];   
    BuildTree(pa,cur+1,a); 
    return 0;  
}              
int Statistic(Tree *root)
{
    int i,j,k,tag;
    Tree *p;
    for(i=0;i<N;i++)
    {
        p=root;
        tag=1;
        for(j=0;j<strlen(number[i]);j++)
        {
            if(p->cl[number[i][j]-'0']!=NULL)
               p=p->cl[number[i][j]-'0'];  
            else {tag=0;printf("0\n");break; }    
        }
        if(tag)printf("%d\n",p->num);
    }            
    return 0;
}  
int Delete(Tree *pa)
{
    int i,rear,now;
    rear=now=0;
    stack[rear++]=pa;
    Tree *t;
    while(now!=rear)
    {
        pa=stack[now++];       
        for(i=0;i<10;i++)
        {
            if(pa->cl[i]!=NULL)stack[rear++]=pa->cl[i];
        }
        t=pa;
        free(pa); 
        t=NULL; 
        rear=rear%1000;
        now=now%1000;
    }    
    return 0;     
}               
int main()
{
    int T;
    int i,j,k,sum;   
    scanf("%d",&T);
    for(i=0;i<T;i++)
    {
        Tree *root,*p;
        root=(Tree *)malloc(sizeof(Tree));
        root->num=0;
        p=root;
        for(j=0;j<10;j++)root->cl[j]=NULL;
        scanf("%d%d",&N,&M);
        k=0;   
        for(j=0;j<N;j++)
        {
            scanf("%s",number[j]);
        }
        for(j=0;j<M;j++)
        {
            scanf("%s",dict[j]);
            p=root;
            for(k=0;k<strlen(dict[j]);k++)
            {
                if(dict[j][k]<='r')
                dict[j][k]=(dict[j][k]-'a')/3+'2';
                else
                {
                    switch(dict[j][k])
                    {
                        case 's':dict[j][k]='7';break;
                        case 't':dict[j][k]='8';break;
                        case 'u':dict[j][k]='8';break;
                        case 'v':dict[j][k]='8';break;
                        case 'w':dict[j][k]='9';break;
                        case 'x':dict[j][k]='9';break;
                        case 'y':dict[j][k]='9';break;
                        case 'z':dict[j][k]='9';break;
                    }
                }        
                        
            }
            BuildTree(p,0,dict[j]); 
        }      
        Statistic(root);
        Delete(root);
    }
    return 0;
}            
        
    


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值