HDU 1671 Phone list 字典树

题目链接:HDU 1671

一道简单的字典树,需要判断号码是否包含其它号码,或者包含于其它号码,在更新字典树时判断即可

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<map>
#include<queue>
using namespace std;
#define N 10005

int tot;
int flag;
int trie[N*10][10];
int vis[N*10];

void update(char *s,int rt)
{
    for(int i=0;s[i];i++)
    {
        int x=s[i]-'0';
        if(!trie[rt][x])
        {
            trie[rt][x]=++tot;
        }
        rt=trie[rt][x];
        if(vis[rt]) flag=1;//如果包含其他号码
    }
    for(int i=0;i<=9;i++) if(vis[trie[rt][i]]) flag=1;//如果包含于其他号码
    vis[rt]=1;
}

char s[15];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        tot=0;
        flag=0;
        scanf("%d",&n);
        getchar();
        memset(trie,0,sizeof(trie));
        memset(vis,0,sizeof(vis));
        for(int i=0;i<n;i++)
        {
            gets(s);
            update(s,0);
        }
        if(flag) printf("NO\n");
        else printf("YES\n");
    }
    return 0;
}

向室友学了一下结构体实现的字典树

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<map>
#include<queue>
using namespace std;
#define N 10005

int tot;
int flag;
struct node
{
    int ch[11];
    int vis;
    void init()
    {
        memset(ch,0,sizeof(ch));
        vis=0;
    }
}trie[100005];


void update(char *s,int rt)
{
    for(int i=0;s[i];i++)
    {
        int x=s[i]-'0';
        if(!trie[rt].ch[x])
        {
            trie[rt].ch[x]=++tot;
            trie[tot].init();
        }
        rt=trie[rt].ch[x];
        if(trie[rt].vis) flag=1;
    }
    for(int i=0;i<=9;i++) if(trie[rt].ch[i]) flag=1;
    trie[rt].vis=1;
}

char s[15];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        tot=0;
        flag=0;
        scanf("%d",&n);
        getchar();
        trie[0].init();
        for(int i=0;i<n;i++)
        {
            gets(s);
            update(s,0);
        }
        if(flag) printf("NO\n");
        else printf("YES\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sasuke_gaara/article/details/80214244
今日推荐