判断给出的所有号码中是否存在前缀树
思路是我们只需判断每个树中是否含有其他树,标记每个树的末尾为1
则如果某棵树的遍历过程标记大于1,说明含前缀树
之前用结构体封装写的,结果老是栈溢出,不用结构体就好了
代码如下:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAXN 10010
#define LL long long
using namespace std;
char str[MAXN][12];
int ch[MAXN*10][30];
int val[MAXN*10];
int sz;
int id(char c) {
return c-'0';
}
void insert(char s[], int v) {
int u = 0, n = strlen(s);
for(int i=0; i<n; ++i) {
int c = id(s[i]);
if(!ch[u][c]) {
val[sz] = 0;
ch[u][c] = sz++;
}
u = ch[u][c];
}
val[u] = v;
}
bool search(char s[]) {
int u = 0, n = strlen(s);
int cnt = 0;
for(int i=0; i<n; ++i) {
int c = id(s[i]);
u = ch[u][c];
if(val[u])
++cnt;
}
if(cnt > 1) {
return true;
}
return false;
}
int main(void) {
int T, n;
scanf("%d", &T);
while(T--) {
sz = 1;
memset(ch, 0, sizeof(ch));
memset(val, 0, sizeof(val));
scanf("%d", &n);
for(int i=0; i<n; ++i) {
scanf("%s", str[i]);
insert(str[i], 1);
}
bool ok = false;
for(int i=0; i<n; ++i) {
if(search(str[i])) {
ok = true;
break;
}
}
if(ok)
printf("NO\n");
else printf("YES\n");
}
return 0;
}