题意:判断是否有一电话号码是另一个的前缀。
思路:建立字典树, 参考维基百科:http://zh.wikipedia.org/wiki/Trie
需要注意的是最后释放内存,否则会MLE。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
const int N = 10;
struct Trie {
bool flag;
Trie *next[N];
Trie() {
flag = true;
int i;
for (i = 0; i < N; ++i)
next[i] = NULL;
}
};
bool flag;
void creat(Trie *root, char s[]) {
int i, len, b;
len = strlen(s);
Trie *p = root;
for (i = 0; i < len; ++i) {
b = s[i] - '0';
if (p->next[b]) {
if (p->next[b]->flag == false || i == len-1) {
flag = true;
return;
}
}
else
p->next[b] = new Trie();
p = p->next[b];
}
p->flag = false;
}
void freedom(Trie *&root) {
int i;
for (i = 0; i < N; ++i)
if (root->next[i] != NULL)
freedom(root->next[i]);
free(root);
}
int main()
{
int t, n;
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
flag = false;
char s[19];
Trie *root = NULL;
root = new Trie();
while (n--) {
scanf("%s", s);
if (flag)
continue;
creat(root, s);
}
if (flag)
printf("NO\n");
else
printf("YES\n");
freedom(root);
}
return 0;
}