/*
Trie树,一开始用的class, new, delete等面向对象的东西,结果TLE
后来改用数组实现就OK了
这题只需要insert操作,无需search操作,边插入边判断就OK了
*/
#include <iostream>
#define MAX_N 120000
using namespace std;
int trieTree[MAX_N + 1][12]; //第10位是ID,第11位是count
int countv = 0;
bool insert(char phone[], int id)
{
int curNode = 0, i, next;
char c;
for(i = 0; i < strlen(phone); i++)
{
c = phone[i];
trieTree[curNode][11]++;
next = trieTree[curNode][c - '0'];
if(next == 0)
trieTree[curNode][c- '0'] = next = ++countv;
curNode = next;
if(trieTree[curNode][10] != 0)
return false;
}
if(trieTree[curNode][11] > 0)
return false;
trieTree[curNode][10] = id;
return true;
}
int main()
{
int caseNum, c, i, pNum;
char temp[10];
scanf("%d", &caseNum);
for(c = 0; c < caseNum; c++)
{
memset(trieTree, 0, sizeof(trieTree));
countv = 0;
scanf("%d", &pNum);
bool can = true;
for(i = 0; i < pNum; i++)
{
scanf("%s", temp);
if(can)
if(!insert(temp, i + 1))
can = false;
}
if(can)
printf("YES/n");
else
printf("NO/n");
}
return 0;
}
POJ 3630 Phone List
本文介绍了一种使用Trie树实现电话号码簿的方法,通过数组而非面向对象的方式优化了性能,避免了时间限制错误。文章详细展示了插入操作的过程,并提供了一个完整的C++代码示例。


被折叠的 条评论
为什么被折叠?



