您的位置:首页 > 其它

hdoj 4287 Intelligent IME 字典树

2013-03-12 09:17 369 查看
2012天津赛区网络赛的题,当年被一个大一的学弟A了,今天重温数据结构,做了一下,水题,没多大意义!

不能用数字来匹配单词,那样复杂度太大,反过来比较简单!

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

struct node
{
int m;
node *next[10];
int su;
node()
{
m=0;
su=0;
for(int i=0;i<10;i++)
next[i]=NULL;
}
};

int map[26];
node *root;
int n,m;
char num[5006][7];

//这个地方是初始化map
void init()
{
int cs=0;
for(int i=2;i<=9;i++)
{
if(i==7||i==9)
{
for(int j=0;j<4;j++)
map[cs++]=i;
}
else
{
for(int j=0;j<3;j++)
map[cs++]=i;
}
}
}

void insert_tree(char *s)
{
int id;
int len=strlen(s);
node *p,*q;
if(root==NULL)
{
root = new node;
}
p=root;
for(int i=0;i<len;i++)
{
id=s[i]-'0';
if(p->next[id]==NULL)
{
q=new node;
p->next[id]=q;
p=p->next[id];
}
else
{
p=p->next[id];
}
if(i==len-1)
{
p->m=1;
}
}
}

//检查是否存在
void check(char *s)
{
int id;
int len=strlen(s);
node *p,*q;
p=root;
for(int i=0;i<len;i++)
{
id=map[s[i]-'a'];
if(p->next[id]==NULL)
return ;
else
p=p->next[id];
if(i==len-1)
{
if(p->m==1)
p->su++;
}
}
return ;
}

int search_tree(char *s)
{
int id,len;
node *p;
p=root;
len=strlen(s);
for(int i=0;i<len;i++)
{
id=s[i]-'0';
p=p->next[id];
if(i==len-1)
{
return p->su;
}
}
}

void delete_tree(node *s)
{
for(int i=0;i<10;i++)
{
if(s->next[i]!=NULL)
{
delete_tree(s->next[i]);
}
}
delete s;
}

int main()
{
init();
int t;
scanf("%d",&t);
char s[10];
int x,y;
while(t--)
{
root=NULL;
memset(num,0,sizeof(num));
scanf("%d%d%*c",&n,&m);
x=n,y=m;
while(n--)
{
scanf("%s%*c",s);
strcpy(num
,s);
insert_tree(s);
}
while(m--)

4000
{
scanf("%s%*c",s);
check(s);
}
for(int i=x-1;i>=0;i--)
{
printf("%d\n",search_tree(num[i]));
}
delete_tree(root);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  字典树 ACM