1671 字典树

来源:互联网 发布:春光灿烂猪八戒 知乎 编辑:程序博客网 时间:2024/06/03 16:54

链表实现 328MS

#include <stdio.h>#define N 10struct Node{    Node *next[N];    bool vis;//字符串的结束 最后一个字符    void init()    {        vis=0;        for (int i=0;i<N;i++)    next[i]=NULL;    }};bool build(char *s,Node *root){    Node *p=root;int x;    for (;*s;s++)    {x=*s-'0';if (*(s+1)==0 && p->next[x]!=NULL)// 1.当前串 是别的串的子串 只判断一次{return 1;}        if (p->next[x]==NULL)        {            Node *q=new Node;            q->init();            p->next[x]=q;                    }p=p->next[x];        if (p->vis)    return 1;// 2.别的串是当前串的子串 每个节点都判断    }    p->vis=1;//当前串的结束节点    return 0;}void end(Node *root)//释放内存{    for (int i=0;i<N;i++)    {        if (root->next[i]!=NULL) end(root->next[i]);        delete root->next[i];        root->next[i]=NULL;    }}int main (){    //freopen("1671.txt","r",stdin);    int T,n;    bool flag;    char s[15];    scanf("%d",&T);    while(T--)    {        scanf("%d",&n);        flag=0;        Node *root=new Node;        root->init();        while(n--)        {            scanf("%s",s);            if ( build(s,root) )            {                flag=1;                break;            }        }        while(flag && n--)        {            scanf("%s",s);        }        if (flag)  puts("NO");        else puts("YES");        end(root);    }}


数组实现 62MS

#include <stdio.h>#include <string.h>#define N 10struct Node{int child[N];bool vis;//字符串的结束 最后一个字符void init(){vis=0;memset(child,-1,sizeof(child));}}t[100010];bool flag;int idx;void build(char *s){int x;int k=0;//currentfor (;*s;s++){x=*s-'0';if (*(s+1)==0 && t[k].child[x]!=-1)// 1.当前串 是别的串的子串 只判断一次{flag=0;return;}if (t[k].child[x]==-1){t[k].child[x]=++idx;t[idx].init();}k=t[k].child[x];if (t[k].vis)// 2.别的串是当前串的子串 每个节点都判断{flag=0;return;}}t[k].vis=1;}int main (){//freopen("1671.txt","r",stdin);int T,n;char s[15];scanf("%d",&T);while(T--){scanf("%d",&n);flag=1;idx=0;t[0].init();while(n--){scanf("%s",s);if (flag)  build(s);}if (!flag)  puts("NO");else puts("YES");}}


原创粉丝点击