Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
AC了,提醒一下后来人使用Trie树的第一,不要动态分配内存,直接分配一块大内存,使用,但是记得使用完后清空。 第二,输入的数据有需要排序,先短后长的输入,如果不排序也可以,但是必须加一个属性判断要在当前落脚的位置是否是被别人走过的,如果是,说明你是别人的前缀,也得输出NO 最后贴上自己的AC代码 #include <iostream> #include <math.h> #include <string.h> #include <stdio.h> using namespace std; int mx(int a,int b,int c) { a=a>b?a:b; a=a>c?a:c; return a; } int mx(int a,int b) { return a>b?a:b; } struct TrieNode{ bool terminal; bool visited; TrieNode * son[10]; TrieNode(){ terminal=false; visited=false; memset(son,0,sizeof(son)); } }; class TrieTree{ public: TrieNode root; TrieNode mempool[1000000]; int midx; bool Insert(char * num) { TrieNode *tmp=&root; while (*num) { if(tmp->son[*num-'0']==0) { mempool[midx].terminal=false; mempool[midx].visited=false; memset(mempool[midx].son,0,40); tmp->son[*num-'0']=(mempool+midx); midx++; } tmp=tmp->son[*num-'0']; if(tmp->terminal)//发现前缀 { return true; } num++; if(*num==0)//定位 { if(tmp->visited) return true; tmp->terminal=true; tmp->visited=true; break; } tmp->visited=true; } return false; } void clear() { memset(root.son,0,sizeof(root.son)); midx=0; } TrieTree() { //root=new TrieNode; midx=0; } ~TrieTree() { //delete root; } }; char buf[11]; TrieTree ttree; int main() { int n,m; scanf("%d",&n); while(n--) { ttree.clear(); scanf("%d",&m); bool hasprefix=false; while (m--) { scanf("%s",buf); if(hasprefix) continue; if(ttree.Insert(buf)) { hasprefix=true; } } if(hasprefix) printf("NO\n"); else printf("YES\n"); } } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator