题目链接:http://poj.org/problem?id=3630
题意:在给出的相应数量的字符串中,如果存在一个字符串是另一个字符串的前缀,就输出“NO“否则输出”YES“。
解题思路:分两种情况:如果字符串A是字符串B的前缀,1是A在B的前面,2是A在B的后面。我在这里只用了trie树的插入,同时将相应字符串的下标存入trie树中,便于判断,第一次将所有的字符串插入,是处理第1种情况,第二次插入是处理第2种情况。
#include<cstdio>
#include<cstring>
using namespace std;
struct trie
{
int next[10];
int id;
}tree[100005];
bool flag;
int cnt;
char s[10005][15];
void insert(char *t,int id)
{
int len=strlen(t);
int p=0;
for(int i=0;i<len;++i)
{
int x=t[i]-'0';
if(tree[p].next[x]==0)
tree[p].next[x]=(cnt++);
if((tree[p].id)&&(tree[p].id!=id))//如果这个字符串某个位置不为0,说明在前面的字符串出现过,flag=false;
flag=false;
p=tree[p].next[x];
}
tree[p].id=id;
}
int main()
{
int d,n;
scanf("%d",&d);
while(d--)
{
flag=true;
cnt=1;
scanf("%d",&n);
memset(tree,0,sizeof(tree));
for(int i=1;i<=n;++i)
{
scanf("%s",s[i]);
insert(s[i],i);//处理第1种情况
}
if(flag==false)
{
printf("NO\n");
continue;
}
for(int i=1;i<=n;++i)
{
insert(s[i],i);//处理第2种情况。
if(flag==false) break;
}
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}