字典树(POJ 2503)
2024-08-29 21:21:06
它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。 它有3个基本性质:
根节点不包含字符,除根节点外每一个节点都只包含一个字符; 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串; 每个节点的所有子节点包含的字符都不相同。 #include <iostream>
#include<cstring>
#include<cstdio> using namespace std; const int M=;
char word[][];
int wp;
struct node
{
int next[];
int value;
bool end;
}tree[M]; int pi=; void init() //初始化
{
memset(tree,,sizeof(tree)); //将一个数组全部元素赋成0 //只能是-1和0
pi=;
wp=;
} void insert(char * keyword,int value) //建树
{
int index,p,i;
for(i=p=;keyword[i];i++)
{
index=keyword[i]-'a'; //
if(tree[p].next[index]==) //
tree[p].next[index]=pi++; p=tree[p].next[index];
}
tree[p].value=value;
tree[p].end=;
} bool query(char * keyword,int& value)
{
int index,p,i;
for(i=p=;keyword[i];i++)
{
index=keyword[i]-'a';
if(tree[p].next[index]==)
return ;
p=tree[p].next[index];
}
if(tree[p].end)
{
value=tree[p].value;
return ;
}
return ;
} int main()
{
char s1[],s2[],s[];
int i,value;
while(gets(s))
{
if(!strlen(s)) //有字母就不跳出
break; for(i=;i<strlen(s);i++)
{
if(s[i]==' ') //空格
break;
}
strncpy(s1,s,i); //把s的前i位复制给s1
s1[i]=;
strcpy(s2,s+i+); //把s的i位之后复制给s2
strcpy(word[wp],s1); //
insert(s2,wp++); //
}
while(scanf("%s",s)!=EOF)
{
if(query(s,value)) //到相应字母 然后输出
printf("%s\n",word[value]);
else
printf("eh\n"); //没找到输出eh
}
return ;
}
最新文章
- InvokeRequired 线程间访问
- javascript 中正则表达式应用
- thinkphp 验证
- .NET项目开发的几个非常重要的项目设置
- Python 输出文字带颜色
- Java Final, Finally, Finalize
- Entity Framework 学习第一天
- Cocos2d-x坐标系介绍
- ios开发——实用技术篇Swift篇&;录音
- 【HDU 5370】 Tree Maker(卡特兰数+dp)
- HTML5储存
- [BC Round#26] Card 【各种水】
- python - 执行父类中的方法
- Java核心技术,让计算机";一芯多用";的多线程技术
- 正则提取文本中的颜色值 #xxxx,不严谨版本
- SVN Access to &#39;/svn/Test/!svn/me&#39; forbidden,不能更新解决办法
- 【搬运】Tea算法Java实现工具类
- iOS日历中给一个事件添加多个提醒
- Qt5模块简介
- allegro把formate symbol文件从一个文件拷入另一个文件的方法