POJ -- 3630 Phone List(Trie 树)

来源:互联网 发布:开淘宝店要投入多少钱 编辑:程序博客网 时间:2024/05/21 21:41

题目大意:

t 组测试样例,每个样例有n个电话号码,问是否一个电话号码是另一个电话号码的前缀,是输出no,否输出yes;

注意:数据比较大,静态建树,统一分配内存。

代码实现:

①:排序,按照字符串的字典序,用string类型,直接进项sort排序就行(默认字典序顺序),避免这样的样例:

911111

911

字典序大的字符串在前面;

#include<cstdio>#include<cstring>#include<string>#include<algorithm>#include<iostream>using namespace std;bool flag;int id;struct tree{    bool flag;    tree *next[10];}*root,node[100005];void Insert(string &number){    tree *p=root;    int i=0,x;    while(number[i]){        x=number[i++]-'0';        if(!(p->next[x])) p->next[x]=&node[++id];        p=p->next[x];        if(p->flag==1) flag=1;    }    p->flag=1;}int main(){    int t,n;    scanf("%d",&t);    string number[10005];    while(t--){        flag=id=0;        memset(node,0,sizeof(node));        root=&node[0];        scanf("%d",&n);        for(int i=0;i<n;++i) cin>>number[i];        sort(number,number+n);        for(int i=0;i<n;++i) Insert(number[i]);        if(!flag) cout<<"YES"<<endl;        else cout<<"NO"<<endl;    }}

②:不需要排序,既要在插入过程中,判断当前插入的位置时候是别的字符串的结束位置  / /1,又要在插入字符串后,判断当前位置是否还连接了别的字符/ / 2 ;

#include<cstdio>#include<cstring>#include<string>#include<algorithm>#include<iostream>using namespace std;bool flag;int id;struct tree{    bool flag;    tree *next[10];}*root,node[100005];void Insert(string &number){    tree *p=root;    int i=0,x;    while(number[i]){        x=number[i++]-'0';        if(!(p->next[x])) p->next[x]=&node[++id];        p=p->next[x];        if(p->flag==1) flag=1;//1    }    p->flag=1;    for(int i=0;i<10;++i){ // 2        if(p->next[i]){            flag=1;            break;        }    }}int main(){    int t,n;    scanf("%d",&t);    string number[10005];    while(t--){        flag=id=0;        memset(node,0,sizeof(node));        root=&node[0];        scanf("%d",&n);        for(int i=0;i<n;++i) cin>>number[i];        for(int i=0;i<n;++i) Insert(number[i]);        if(!flag) cout<<"YES"<<endl;        else cout<<"NO"<<endl;    }}




0 0