题意:找到一堆单词中是否存在单词是另一个单词的前缀
思路:字典树
这里要做一个标记,标记搜到的单词是否是一个完结的单词,比如字典树中有个单词abc,然后你搜abcd,abc是abcd的前缀但是abc没有任何标记,所以给个标记在搜到abc时发现标记为true,说明有前缀存在,再插入时,插入的最后将最后一个节点标记为true。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
struct Trie
{
struct Trie * child[2];
int n;
bool flag;
};
struct Trie *root;
int flag = 0;
void insert(char *str)
{
int i,j,len;
len = strlen(str);
struct Trie * node,*tnode;
node = root;
if(len == 0)
return ;
for(i = 0; i < len; i++)
{
if(node -> child[str[i]-'0'] != NULL)
{
node = node -> child[str[i]-'0'];
node -> n = node -> n +1;
if(node -> n > 1 && node -> flag)
flag = 1;
}
else
{
tnode = (struct Trie *)malloc(sizeof(struct Trie));
for(j = 0; j < 2; j++)
{
tnode -> child[j] = NULL;tnode -> flag = false;
}
node -> child[str[i]-'0'] = tnode;
node = tnode;
node -> n = 1;
}
if(i == len-1)
{
node -> flag = true;
}
}
}
int main()
{
char c[1000];
int cas = 1,i;
root = (struct Trie*)malloc(sizeof(struct Trie));
for(i = 0; i < 2; i++)
{
root -> child[i] = NULL;root -> n = 0; root -> flag = false;
}
while(scanf("%s",c) != EOF)
{
if(c[0] != '9')
{
insert(c);
}
else
{
if(flag)
printf("Set %d is not immediately decodable\n",cas++);
else
printf("Set %d is immediately decodable\n",cas++);
root = (struct Trie*)malloc(sizeof(struct Trie));
for(i = 0; i < 2; i++)
{
root -> child[i] = NULL;root -> n = 0; root -> flag = false;
}
flag = 0;
}
}
return 0;
}