您的位置:首页 > 其它

字典树 hdu 1075

2015-07-24 11:06 330 查看
#include"stdio.h"
#include"ctype.h"
#include"stdlib.h"
#include"string.h"
#include"algorithm"
using namespace std;
struct Trie
{
struct Trie * next[26];
int flag;
};
char xx[1000005][15];   //数组要开1000000,题目没写那么清楚
Trie * H = NULL;
Trie * init()
{
Trie * l = new Trie;
for(int i = 0;i < 26;i ++)
{
l ->next[i] = NULL;
}
l ->flag = 0;   //初始化为0
return l;
}
void Add(char * s,int x)
{
Trie * l = H;
int len = strlen(s);
for(int i = 0;i < len;i ++)
{
int k = s[i] - 'a';
if(l ->next[k] == NULL)
{
l ->next[k] = init();
}
l = l ->next[k];
}
l ->flag = x;    //存起来的时候标记成数组下标 ,查找方便
};
void Cls(Trie * l)
{
for(int i = 0;i < 26;i ++)
{
if(l ->next[i] != NULL)
{
Cls(l ->next[i]);
}
}
free(l);
}
void Search(char * s)
{
Trie * l = H;
int len = strlen(s);
int pl = 1;
for(int i = 0;i < len;i ++)
{
int k = s[i] - 'a';
if(l ->next[k] == NULL)
{
pl = 0;
break;
}
l = l ->next[k];
}
if(l ->flag && pl)  //查找看有没有这个单词,有的话就输出对应下标的字符串,添加时的下标记录用上了
{
printf("%s",xx[l ->flag]);
}
else  //没找到就输出自己
{
printf("%s",s);
}
}
int main()
{
int a,b,c,d,pl = 0;
char vv[30005];
while(~scanf("%s",vv))
{
if(strcmp(vv,"START") == 0 && !pl)   //先保存到数组 ,下标从一开始,因为一会搜索要用
{
H = init();
pl = 1;
int l = 1;
while(1)
{
scanf("%s",xx[l]);
if(strcmp(xx[l],"END") == 0)
break;
else
{
scanf("%s",vv);
Add(vv,l);
l ++;
}
}
}
else
{
getchar();    //加一个gechar(),因为上面是scanf结尾,要去掉一个回车
pl = 0;
while(1)
{
char mm[20];
gets(vv);
if(strcmp(vv,"END") == 0)
break;
else
{
int l = strlen(vv);
int k = 0;
for(int i = 0;i < l;i ++)
{
if(isalpha(vv[i]))
{
mm[k++] = vv[i];
}
else
{
if(k > 0)   //在mm数组里有值得时候才去搜索,以为mm没有初始化
{
mm[k] = '\0';
Search(mm);
}
k = 0;   //个数归零
printf("%c",vv[i]);   //输出不是字母的东西,比如'.','!','?',' '之类的
}
}
printf("\n");
}
}
Cls(H);   //清不清空都行,以为只有一个例子,但我习惯清空了
}
}
return 0;
}


http://acm.hdu.edu.cn/showproblem.php?pid=1075
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: