/*一开始用暴力解决,果断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;
}
2012天津赛区网络赛 - 1010 - Intelligent IME - HDU - 4287
最新推荐文章于 2024-09-21 09:43:26 发布