POJ - 3630 Phone List (字典树)

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-05 14:11:49

 t 组数据,n 个电话号码,如果拨打号码的时候,先拨通了某个号码,那么这一串号码就无法全部拨通,

 eg:911 和 9112016652 相比 后者就无法被拨通,因为 911 会先被拨通。

如果n 个电话号码都可拨通,输出 YES ,不然输出 NO。

 

Input

样例数t(1 ≤ t ≤ 40), 每组样例有 n个电话号码,(1 ≤ n ≤ 10000).

接下来有n个号码字符串,每个字符串最多10位。

Output

对于每组样例,如果n 个电话号码都可拨通,输出 YES ,不然输出 NO。

Sample Input

2
3
911
97625999
91125426
5
113
12340
123440
12345
98346

Sample Output

NO
YES
#include<cstdio>
#include<cstring>
using namespace std;

const int maxn=1e5+5;
char s[maxn][15];
int trie[maxn][15];
bool flag[maxn];
int k;

void insert_(char a[])
{
    int p=0;
    int len=strlen(a);
    for(int i=0;i<len;i++)
    {
        int c=a[i]-'0';
        if(!trie[p][c])
            trie[p][c]=++k;
        p=trie[p][c];
    }
    flag[p]=1;
}

bool find_(char a[])
{
    int p=0;
    int len=strlen(a);
    for(int i=0;i<len-1;i++)
    {
        int c=a[i]-'0';
        p=trie[p][c];
        if(flag[p])
            return 0;
    }
    return 1;
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(trie,0,sizeof(trie));
        memset(flag,0,sizeof(flag));
        int n,ok=1;
        k=0;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            scanf("%s",s[i]);
            insert_(s[i]);
        }
        for(int i=0;i<n;i++)
        {
            if(!find_(s[i]))
            {
                ok=0;
                break;
            }
        }
        if(ok)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}
 
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!