structNode { Node* ne[10]; bool danger, flag; // if node has next pointer set the flag true } node[MAX], *root; int K;
Node* New(){ // get a new pointer which has not be allocate. Node* ret = &node[K++]; for (int i = 0; i < 10; i++) { ret->ne[i] = NULL; } ret->danger = false; ret->flag = false; return ret; }
voidinit(){ K = 0; root = New(); }
boolinsert(char* s){ Node* ptr = root; char* p = s; int id;
// go along the tree and find whether // s has a dangerous prefix. while (*p) { id = *(p++) - '0'; if (ptr->danger) { returnfalse; } if (ptr->ne[id] == NULL) { ptr->ne[id] = New(); } ptr->flag = true; // set the flag true because this node has next pointer. ptr = ptr->ne[id]; } ptr->danger = true;
// notice: if the next pointer is not null // we say s is a prefix of some words. if (ptr->flag) { returnfalse; } returntrue; }
intmain(){ int t; int n; bool done; char s[1100]; scanf("%d", &t); while (t--) { init(); scanf("%d", &n); done = true; for (int i = 0; i < n; i++) { scanf("%s", s); if (done) { done = insert(s); } } if (done) { puts("YES"); } else { puts("NO"); } } return0; }