hdu 1671 Phone List(数据结构:trie)

来源:互联网 发布:中教数据库怎么样 编辑:程序博客网 时间:2024/06/15 01:35

判断给出的所有号码中是否存在前缀树

思路是我们只需判断每个树中是否含有其他树,标记每个树的末尾为1

则如果某棵树的遍历过程标记大于1,说明含前缀树

之前用结构体封装写的,结果老是栈溢出,不用结构体就好了

代码如下:

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define MAXN 10010#define LL long longusing namespace std;char str[MAXN][12];int ch[MAXN*10][30];int val[MAXN*10];int sz;int id(char c) {    return c-'0';}void insert(char s[], int v) {    int u = 0, n = strlen(s);    for(int i=0; i<n; ++i) {        int c = id(s[i]);        if(!ch[u][c]) {            val[sz] = 0;            ch[u][c] = sz++;        }        u = ch[u][c];    }    val[u] = v;}bool search(char s[]) {    int u = 0, n = strlen(s);    int cnt = 0;    for(int i=0; i<n; ++i) {        int c = id(s[i]);        u = ch[u][c];        if(val[u])            ++cnt;    }    if(cnt > 1) {        return true;    }    return false;}int main(void) {    int T, n;    scanf("%d", &T);    while(T--) {        sz = 1;        memset(ch, 0, sizeof(ch));        memset(val, 0, sizeof(val));        scanf("%d", &n);        for(int i=0; i<n; ++i) {            scanf("%s", str[i]);            insert(str[i], 1);        }        bool ok = false;        for(int i=0; i<n; ++i) {            if(search(str[i])) {                ok = true;                break;            }        }        if(ok)            printf("NO\n");        else printf("YES\n");    }    return 0;}


0 0
原创粉丝点击