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");
    }
}
相關文章
相關標籤/搜索