水题不水之字典树(Tire tree)

来源:互联网 发布:snare for windows 编辑:程序博客网 时间:2024/05/29 17:18

        今天碰到了一个水题不水。题目链接如下:http://acm.nyist.net/JudgeOnline/problem.php?pid=163

        第一感觉就是用字符串存储,然后一个一个地比较,然后,结果你们懂的,显然是TLE(超时),直接给我一个TLE错误,我了个去,然后 没办法才用的字典树。

        又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。

提交的最后AC代码如下所示:

#include <iostream>#include <cstdlib>#include <algorithm>#include <cstring>#include <cstdio>using namespace std;struct TireTree{TireTree* child[10];int number;};void DestroyTireTree(TireTree* root){//destroy a tire treeif(!root)//root is nullreturn;for(int i= 0; i< 10; ++i){//destroy childDestroyTireTree(root->child[i]);}delete root;//destroy root}TireTree* CreateNode(int inode){TireTree* node = new TireTree;node->number = inode;memset(node->child, 0, sizeof(TireTree*)*10);//child is nullreturn node;}bool InsertToTireTree(TireTree* root, int iNode, int* bit, int ilen, int iStep){if(root->number){return false;}if(iStep == ilen-1){//the last bitif(root->child[bit[iStep]]){//has a prefixreturn false;}else{root->child[bit[iStep]] = CreateNode(iNode);return true;}}else{if(!root->child[bit[iStep]]){//child is nullroot->child[bit[iStep]] = CreateNode(0);}return InsertToTireTree(root->child[bit[iStep]], iNode, bit, ilen, iStep+1);}}void HandleEachCase();int main(){int iCaseCount;cin>>iCaseCount;while(iCaseCount--){HandleEachCase();}}void HandleEachCase(){int n;int number[100000];scanf("%d", &n);for(int i= 0; i< n; ++i){scanf("%d", number+i);}int bit[10];int ilen;TireTree* root = CreateNode(0);int tmp;bool ok= true;for(int i= 0; i< n; ++i){tmp = number[i];ilen = 0;while(tmp){bit[ilen++]= tmp%10;tmp/= 10;}reverse(bit, bit+ ilen);if(!InsertToTireTree(root, number[i], bit, ilen, 0)){ok = false;break;}}if(ok){cout<<"YES\n"<<endl;}else{cout<<"NO\n";}DestroyTireTree(root);}


原创粉丝点击