您的位置:首页 > 其它

zju2346 Shortest Prefixes(字典树 trie)

2010-07-16 15:58 387 查看
总算自己做出一道字典树,内牛满面~
题意是给你一串单词,让你找出最短的前缀,使得该前缀能唯一识别该单词
我的方法是建立字典树,并给每个节点的使用次数赋值。
从单词的第一个字母开始找,若找到某个节点使用次数为1,则输出到该节点就是最短前缀。
若没有一个是为1的节点,就全部输出了,题意已说明。

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
#include<string>
#include<sstream>
#include<set>
#include<map>
#include<queue>
#include<stack>
using namespace std;

const int number=26;
int Case=1;

class Trie
{
public:
int num;
Trie *child[number];

Trie()
{
num=0;
for(int i=0;i<number;i++)
{
child[i]=0;
}
}
};

void Insert(Trie *head,char *str)
{
Trie *p=head;
int len=strlen(str);

for(int i=0;i<len;i++)
{
int x=str[i]-'a';
if(p->child[x]==0)
{
p->child[x]=new Trie();
}
p=p->child[x];
p->num++;
}
}

void run()
{
Trie *head=new Trie();
char str[21];
char word[10001][21];

int k=0;
while(gets(str))
{
if(strcmp(str,"")==0) break;
strcpy(word[k++],str);
Insert(head,str);
}

for(int i=0;i<k;i++)
{
Trie *p=head;
printf("%s ",word[i]);

int len=strlen(word[i]);
for(int j=0;j<len;j++)
{
int x=word[i][j]-'a';
p=p->child[x];

if(p->num==1)
{
printf("%c",word[i][j]);
break;
}
else
{
printf("%c",word[i][j]);
}
}
printf("/n");
}
}

int main()
{
int t;
scanf("%d",&t);
cin.get();
cin.get();
while(t--)
{
if(Case>1) printf("/n");
run();
Case++;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: