Phone List
HDU - 1671
代码语言:javascript复制题意:每个字符串都必须不能是别的字符串的前缀。 题解:用字典树,然后给每个字符串的最后打上标记,每次读入一个字符串之后,先判断树里面是否有这个字符串的前缀,在判断这个字符串是否是之前的前缀。
#include <bits/stdc .h>
using namespace std;
struct node
{
struct node *next[12];
int flag;
node()
{
for(int i = 0; i < 12; i ) next[i] = NULL;
flag = 0;
}
};
struct node *root;
bool f = true;
void Insert(string s)
{
node *p = root;
for(int i = 0; i < s.length(); i )
{
int x = s[i] - '0';
if(p -> next[x] == NULL)
{
p -> next[x] = new node; //建立新的字母节点
}
p = p -> next[x];
if(p -> flag != 0) // 如果不是零,表示之前存在字符串是这个字符串的前缀
{
f = false;
break;
}
}
p -> flag ; // 只是在这个字符串的结尾打个标记
for(int i = 0; i < 12; i )
{
if(p -> next[i] != NULL)
{
f = false;
return ;
}
}
return ;
}
void del(struct node *root)
{
if(root == NULL) return ;
for(int i = 0; i < 12; i )
{
if(root->next[i] != NULL)
{
del(root->next[i]);
}
}
delete root;
}
int main()
{
int T,n,k;
string s;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
root=new node;
f=true;
while(n--)
{
cin >> s; //string 用 cin 读
Insert(s);
}
if(f)printf("YESn");
else printf("NOn");
del(root);
}
return 0;
}