poj3630

题目链接: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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值