题目大意:
输入多串数字串,要求判断是否有的数字串是其它串的前缀。如果存在输出NO,否则输出YES。
解题思路:
用trie建立字典树,然后在每个数字串的结尾处标志1,之后每输入一个串,就判断一下。是否有之前的标志记号。
代码:
#include<iostream>
using namespace std;
const int MAX_LEN = 11;
typedef struct trie
{
trie *next[10];
int num;
} T;
T *tree;
bool flag;
void trieDel(T *p)
{
for(int i = 0; i < 10; i++)
{
if(p->next[i] != NULL)
trieDel(p->next[i]);
}
free(p);
}
void trieInsert(char str[])
{
T *p = tree, *q;
int len = strlen(str);
for(int i = 0; i < len; i++)
{
int id = str[i] - '0';
if(p->next[id] == NULL)
{
q = new T;
for(int j = 0; j < 10; j++)
q->next[j] = NULL;
q->num = 0;
p->next[id] = q;
p = p->next[id];
}
else
p = p->next[id];
if(p->num == 1)
flag = false;
}
p->num = 1;
for(int i = 0; i < 10; i++)
{
if(p->next[i] != NULL)
{
flag = false;
break;
}
}
}
void init()
{
tree = new T;
for(int i = 0; i < 10; i++)
{
tree->next[i] = NULL;
}
}
int main(void)
{
int cas;
scanf("%d", &cas);
while(cas--)
{
flag = true;
int n;
scanf("%d", &n);
getchar();
init();
for(int i = 0; i < n; i++)
{
char str[MAX_LEN];
gets(str);
if(!flag)
continue;
trieInsert(str);
}
trieDel(tree);
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
浙公网安备 33010602011771号