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);
}
}
不能用数字来匹配单词,那样复杂度太大,反过来比较简单!
#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);
}
}
相关文章推荐
- hdu 4287 Intelligent IME 字典树
- HDOJ 题目4287 Intelligent IME(STL)
- HDU - 4287 Intelligent IME 字典树
- hdu 4287 Intelligent IME (字典树)
- hdu 4287 Intelligent IME (字典树+dfs)
- HDU 4287 Intelligent IME(字典树)
- HDU 4287 Intelligent IME(字典树)
- [字典树] HDU 4287 - Intelligent IME
- HDOJ-4287 Intelligent IME
- HDU-4287 Intelligent IME (Trie 字典树 入门题)
- hdu 4287 Intelligent IME (字典树)
- HDU_4287_Intelligent IME(字典树)
- ACM学习历程—HDU 4287 Intelligent IME(字典树 || map)
- HDU 4287 Intelligent IME (map水题或字典树+DFS)
- hdoj-4287-Intelligent IME
- HDOJ5687 字典树模板,数组实现
- (字典树)Hat’s Words -- HDOJ
- HDOJ1251 统计难题(字典树)
- [HDOJ 1251] 统计难题 [字典树]
- HDOJ 1075 What Are You Talking About (字典树映射)