POJ 3630 Phone List 字典树
今晚学了字典树,找来一题熟悉熟悉,直接套模板,一开始在Sicily过了,但在POJ 超时,囧,看了别人的解题报告,直接开个10000数组来储存节点,而不是插入时再new一个,就这样AC掉了
#include <iostream>
#include <stdio.h>
#include <memory.h>
#include <string.h>
using namespace std;
int nodenum;
bool find_prex;
struct Trie_node
{
bool isStr;
Trie_node *next[10];
Trie_node()
{
isStr = false;
memset(next, NULL, sizeof(next));
}
};
Trie_node node[100000];
class Trie
{
public:
Trie();
void clear();
void insert(char *);
private:
Trie_node *root;
};
void Trie::clear()
{
for (int i = 0; i < nodenum; i++)
{
node[i].isStr = false;
memset(node[i].next, NULL, sizeof(node[i].next));
}
}
Trie::Trie()
{
root = &node[0];
}
void Trie::insert(char * word)
{
//当找到一个number不符合题意的话,就不做插入操作
if (find_prex) return;
Trie_node *p = root;
while (*word)
{
//当在树中找到一个单词是插入单词的前缀时,停止查找
if (p->isStr)
{
find_prex = true;
return ;
}
if (p->next[*word-'0'] == NULL)
{
Trie_node *tmp = &node[nodenum];
p->next[*word-'0'] = tmp;
nodenum++;
}
p = p->next[*word-'0'];
word++;
}
//判断树中是否有元素与插入的number相同
if (p->isStr)
find_prex = true;
//判断树中是否有元素的前缀是插入单词
for (int i = 0; i < 10; i++)
if (p->next[i] != NULL)
{
find_prex = true;
return ;
}
p->isStr = true;
}
int main()
{
Trie t;
int cases, n;
char number[11];
cin >> cases;
while (cases--)
{
nodenum = 1;
find_prex = false;
cin >> n;
for (int i = 0; i < n; i++)
{
scanf("%s", number);
if (!find_prex)
t.insert(number);
}
if (!find_prex)
cout << "YES" << endl;
else
cout << "NO" << endl;
t.clear();
}
}
浙公网安备 33010602011771号