pku 3630(静态trie树)

用动态树TLE,改成静态后125ms。将输入字符串按字符串长度从大到小排序然后存入树中,若最后插入

字符的引用次数大于1,则该字符串被覆盖。

静态树的空间要开大一点,不然会RE

 

#include<algorithm> #include<iostream> #include <cstring> using namespace std; class node { public: char str[11]; int sz; }; //树的结点,用来排序 class trie { public: int cnt; int next[10]; void init() { this->cnt=0; memset(this->next,-1,sizeof(this->next)); }; }; //trie树 bool consistent; //状态标识 int index; //用来指向静态数组中的可用结点 node dir[10005]; //存储字典 trie tree[100005]; //静态trie树 int cmp(node &a,node &b) //将dir按字符串长度从大到小排序 { return a.sz>b.sz; } void Insert(int root,char *str,int sz) { int t=root; int tag,pos=0; //pos为操作字符串的下标 while(pos<sz) { tag=str[pos]-'0'; if(tree[t].next[tag]== -1) //分配新结点 { tree[index].init(); tree[index].cnt=1; tree[t].next[tag]=index; index++; } else (tree[tree[t].next[tag]].cnt)++; //增加计数 if(pos<sz) t=tree[t].next[tag]; pos++; } if(tree[t].cnt>1) //若被覆盖,则状态标志改变 { consistent=false; } } int main() { int i,cas,n,root; scanf("%d",&cas); while (cas--) { cin>>n; index=1; consistent=true; for(i=0;i<n;++i) { scanf("%s",dir[i].str); dir[i].sz=strlen(dir[i].str); } sort(dir,dir+n,cmp); root=0; tree[root].init(); //init for(i=0;i<n;++i) { Insert(root,dir[i].str,dir[i].sz); if(!consistent) break; } if(!consistent) printf("NO/n"); else printf("YES/n"); } return 0; }

你可能感兴趣的:(tree,存储,Class,insert)