#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>using namespace std;//#define max_n 8001struct Tire{int num;Tire *next[10];};Tire *root;void init() //初始化{root = new Tire;for(int i=0;i<10;++i){root->next[i]=NULL;}}void insert(string word) {int temp, len;Tire *cur;len = word.length();cur = root;for(int i=0;i<len;++i){temp =word[i]-'0';if(cur->next[temp] == NULL)//不存在則建立新的節點{Tire *newTire=new Tire;newTire->num=1;for(int j=0;j<10;++j){newTire->next[j]=NULL;}cur->next[temp]=newTire;//將新節點接到當前節點的next上}else{cur->next[temp]->num++;//注意這個地方,num++的位置,是下一個節點的num++}cur=cur->next[temp];}}void del(Tire *root) //動態建樹,用完釋放記憶體{for(int i=0;i<10;++i){if(root->next[i]!=NULL)del(root->next[i]);}delete(root);}int search(string word){int len, temp;Tire *cur;len=word.length();cur=root;for(int i=0;i<len;++i){temp=word[i]-'0';if(cur->next[temp] == NULL)return 0;cur = cur->next[temp];}return cur->num;}char num[10005][10];int main(){int t,count,n,i;scanf("%d",&t);while(t--){init();int f=1;scanf("%d",&n);for(i=0;i<n;i++){scanf("%s",num[i]);insert(num[i]);}for(i=0;i<n;i++){count=search(num[i]);if(count>1){printf("NO\n");f=0;}}if(f)printf("YES\n");del(root); //釋放記憶體}return 0;}