题意:给定n个电话号码串,问这n个电话号码串中是否存在某一串是其它串的前缀,如果存在输出NO,否则YES
思路:把这n个电话号码串建立成字典树,在插入的时候我们直接判断当前插入的字符串是不是其它串的前缀或者其它串是不是这个串的前缀即可
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN = 1000010;
const int N = 10;
struct Node{
int mark;
Node* child[N];
};
Node node[MAXN];
Node* root;
int pos;
Node* newNode(){
node[pos].mark = 0;
for(int i = 0 ; i < N ; i++)
node[pos].child[i] = NULL;
return &node[pos++];
}
bool insert(char* str){
int len = strlen(str);
Node* s = root;
bool isOk = false;
for(int i = 0 ; i < len ; i++){
if(s->mark == 1)
return false;
int num = str[i]-'0';
if(s->child[num] == NULL){
s->child[num] = newNode();
isOk = true;
}
s = s->child[num];
}
s->mark = 1;
return isOk;
}
int main(){
int cas , n;
bool ans;
char str[MAXN];
scanf("%d" , &cas);
while(cas--){
scanf("%d" , &n);
ans = true;
pos = 0;
root = newNode();
while(n--){
scanf("%s" , str);
if(ans && !insert(str))
ans = false;
}
if(ans)
puts("YES");
else
puts("NO");
}
return 0;
}