POJ - 3630 一道简单的字典树

    刷刷更健康...这道题掌握了字典树难度不大...关键是如何判断是否有串是某串的前缀~~...这个我是用个数组记住每个字符串末尾节点的位置~~做的时候是经过一个点就+1...最后只要判断所有的末尾节点是不是都为1~~~如果都为1当然就说明没有谁为谁的前缀字串~~反之就是有串是某串的前缀字串~~


Program:

#include<iostream>
using namespace std;
struct node
{
    int s[11],k;      
}a[200001];
int t,n,len,judge[10001],g,i;
char s[20];
bool f;
void find(int h,int k)
{
    if (k==len) return;
    a[h].k+=1; 
    if (!a[h].s[s[k]-'0'])  
    {
        g++;
        if (k==len-1) 
        {
            a[g].k=1;
            judge[i]=g;
        }
        a[h].s[s[k]-'0']=g;
    }
    find(a[h].s[s[k]-'0'],k+1); 
    return;
}
int main()
{ 
    scanf("%d",&t);
    while (t--)
    {
          scanf("%d",&n);
          memset(a,0,sizeof(a));
          memset(judge,0,sizeof(judge));
          g=0;  getchar();
          for (i=1;i<=n;i++)
          {
              gets(s);     
              len=strlen(s);
              find(0,0);
          }
          f=true;
          for (i=1;i<=n;i++)
            if (a[judge[i]].k!=1) f=false;
          if (f) printf("YES\n"); else printf("NO\n");
    }
    return 0;   
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值