第一个完整的动态字典树。
好像只有new出来的空间才能delete,构造函数生成的节点不能直接delete。
这题不delete的话会内存超限,想想也是40次,每次建立一个字典树。
好像只有new出来的空间才能delete,构造函数生成的节点不能直接delete。
这题不delete的话会内存超限,想想也是40次,每次建立一个字典树。
#ifdef _DEBUG
#pragma warning(disable : 4996)
#endif
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <map>
#include <algorithm>
#include <functional>
#include <sstream>
#include <utility>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <cctype>
#define CLEAR(a, b) memset(a, b, sizeof(a))
#define CLOSE() ios::sync_with_stdio(false)
#define IN() freopen("in.txt", "r", stdin)
#define OUT() freopen("out.txt", "w", stdout)
#define PF(a) printf("%d\n", a)
#define SF(a) scanf("%d", &a)
#define SFF(a, b) scanf("%d%d", &a, &b)
#define SFFF(a, b, c) scanf("%d%d%d", &a, &b, &c)
#define FOR(i, a, b) for(int i = a; i < b; ++i)
#define LL long long
#define maxn 100005
#define maxm 10005
#define MOD 10007
#define INF 10007
using namespace std;
//-------------------------CHC------------------------------//
struct Node {
int cnt = 0;
Node *next[10];
Node() {
FOR(i, 0, 10) next[i] = NULL;
}
};
void Insert(char *s, Node *root) {
Node *cur = root;
while (*s) {
int id = *s - '0';
if (!cur->next[id]) cur->next[id] = new Node;
cur = cur->next[id];
cur->cnt++;
++s;
}
}
bool check(char *s, Node *root) {
Node *cur = root;
while (*s) {
int id = *s - '0';
cur = cur->next[id];
if (cur->cnt == 1) return true;
++s;
}
return false;
}
void del(Node *root) {
FOR(i, 0, 10) {
if (root->next[i]) del(root->next[i]);
}
delete root;
}
char s[maxn][12];
int main() {
int T;
SF(T);
while (T--) {
Node *root = new Node;
int n;
SF(n);
FOR(i, 0, n) scanf("%s", s[i]), Insert(s[i], root);
bool ok = true;
FOR(i, 0, n) if (!check(s[i], root)) {
ok = false; break;
}
if (ok) printf("YES\n");
else printf("NO\n");
del(root);
}
return 0;
}