题目意思为判断某单词是否以另一单词为前缀,这是字典树的典型应用,需要注意的部分已在代码部分注释。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
struct node
{
bool isTail;
node *next[10];
}memory[1000000],*root;
int cur;
node *build_node()
{
node *p=&memory[cur++];
for(int i=0;i<10;i++)
p->next[i]=NULL;
p->isTail=false;
return p;
}
bool insert_tree(char *s)
{
int len=strlen(s);
node *p=root;
for(int i=0;i<len-1;i++)
{
if(p->next[s[i]-'0']==NULL)
p->next[s[i]-'0']=build_node();
else if(p->next[s[i]-'0']->isTail==true)//当前单词以某已出现的单词为前缀
return false;
p=p->next[s[i]-'0'];
}
if(p->next[s[len-1]-'0']!=NULL)//当前单词是某已出现的单词的前缀
return false;
else
{
p->next[s[len-1]-'0']=build_node();
p=p->next[s[len-1]-'0'];
}
p->isTail=true;
return true;
}
int main()
{
int t,n;
char s[15];
bool ok;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
ok=true;
cur=0;
root=build_node();
for(int i=0;i<n;i++)
{
scanf("%s",s);
if(!ok)
continue;
if(!insert_tree(s))
ok=false;
}
if(ok)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}