phone list (字典树)

#include<iostream>
#include<cstring>
using namespace std;
struct node{int son[11];//电话号码最多11位
bool ed;
void clear(){
memset(son,0,sizeof(son));
ed=0;
}
};
node tree[100010];
char s[10010][11];
int tot;
void insert(int k){
int l = strlen(s[k]), p = 1;
for (int i = 0; i < l; i++) {
if(tree[p].son[s[k][i]-'0']==0)tree[p].son[s[k][i]-'0']=++tot;//(数字0-9字符,用它们的ascii码减去0的ascii码,方便存储)

(如果结果是0则代表还没有输入过,在新节点插入)

p= tree[p].son[s[k][i]-'0'];//指针移动到下一个节点
}
tree[p].ed=1;//输入就标记
}
bool check(int k) {
int l =strlen(s[k]),p=1;
for(int i=0;i<l;i++){
if(tree[p].son[s[k][i]-'0']==0)return 0;
if(tree[p].ed)return 1;
p=tree[p].son[s[k][i]-'0'];
}
return 0;
}
int main(){
int N;
cin>>N;
for(int j=0;j<N;j++){
for(int i=1;i<=100010;i++)if(tree[i].ed)tree[i].clear();
tot=1;
int n;bool f=0;
cin>>n;
for(int i=1;i<=n;i++){
scanf("%s",s[i]);
insert(i);
}
for(int i=1;i<=n;i++){
if(check(i)){
f=1;break;
}
}
if(f)cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
return 0;
}

(参照http://www.cnblogs.com/luyouqi233/p/7859297.html写的,感谢这个博主分享的代码)

(在用指针写结构体的时候运行直接闪退,查明原因后贴上来)

猜你喜欢

转载自www.cnblogs.com/alugonum/p/8953485.html