Trie树【UVA11362】Phone List

Description

给定\(n\)个长度不超过\(10\)的数字串,判断是否有两个字符串\(A\)\(B\),知足\(A\)\(B\)的前缀,如有,输出NO,若没有,输出YES数组

一道\(Trie\)树裸题,我交了20次.spa

呜呜呜呜,难受.code

刚开始是看错题,有的话输出"NO",没有输出“YES”什么鬼题啊!!!ip

一眼看到就会切了的.害得我交了20次啊!字符串

定义数组:

  \(ok[v]\)表示以\(v\)为结尾的字符串是否出现过.string

  \(cnt[u]\)表明当前节点被遍历过几回,判断插入的某字符串的末尾是否被经历过两次以上.io

输出便可.class

记得\(memset\).遍历

代码di

#include<cstdio>
#include<cstring>
#define clear(a) memset(a,0,sizeof a) 
#define R register
using namespace std;
int tri[100005][12],n,T,rt,tot,cnt[100005];
char s[15];
bool flg,ok[100005];
inline void insert(int u,char *s)
{
    int len=strlen(s);
    for(R int i=0;i<len;i++)
    {
        int v=s[i]-'0';
        if(!tri[u][v])
            tri[u][v]=++tot;
        u=tri[u][v];
        cnt[u]++;
        if(ok[u])flg=true;
    }
    ok[u]=true;
    if(cnt[u]>1)flg=true;
}
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        flg=false;
        clear(tri);clear(ok);
        clear(cnt);tot=0;
        scanf("%d",&n);
        for(R int i=1;i<=n;i++)
        {
            scanf("%s",s);
            insert(rt,s);   
        }
        puts(flg?"NO":"YES");
    }
}
相关文章
相关标签/搜索