题目:poj1056
题意:判断一个单词是否在其他单词中以前缀的形式存在
解答:建立字典树。在读到单词末尾的时候如果发现它已经有了,就返回false
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int sonnum = 3;
int ok = 1;
struct Trie
{
int num;
bool terminal;
struct Trie *son[sonnum];
};
Trie *NewTrie()
{
Trie *temp = new Trie;
temp -> num = 1;
temp -> terminal = false;
for(int i = 0;i < sonnum;i++)
temp -> son[i] = NULL;
return temp;
}
void Insert(Trie *pnt,char *s,int len)
{
Trie *temp = pnt;
for(int i = 0;i < len;i++)
{
if(temp -> son[s[i] - '0'] == NULL)
temp -> son[s[i]-'0'] = NewTrie();
else
temp -> son[s[i] - '0'] -> num++;
temp = temp -> son[s[i] - '0'];
}
temp -> terminal = true;
if(temp -> num > 1)
ok = 0;
return;
}
int main()
{
char a[10];
int num = 1;
Trie *tree = NewTrie();
while(~scanf("%s",a))
{
if(strlen(a) == 1 && a[0] == '9')
{
if(ok)
printf("Set %d is immediately decodable\n",num++);
else
printf("Set %d is not immediately decodable\n",num++);
Trie *tree = NewTrie();
ok = 1;
continue;
}
Insert(tree,a,strlen(a));
}
return 0;
}