• Phone List 字典树模板


    题意

      给你n个数字,若这些字符串中有字符串成为一个其他字符串的前缀,输出no,否则输出yes。

    思路

      考虑用字典树存所有字符串,然后遍历一遍,对当前字符串在建好的字典树上查找,若在结尾处的cnt值不等于1,则证明从根到当前字符至少是另一个字符的前缀,符合题意的NO。

    AC代码

    动态申请,poj会T

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    using namespace std;
    const int maxn=1e4+5;
    int t,n;
    char str[maxn][15];
    struct node{
        int cnt;
        struct node *next[26];
        node(){
            cnt=0;
            memset(next,0,sizeof(next));
        }
    };
    node *root;
    void buildtrie(char *s){
        node *p=root;
        node *tmp=NULL;
        int len=strlen(s);
        for(int i=0;i<len;i++){
            if(p->next[s[i]-'0']==NULL){
                tmp=new node;
                p->next[s[i]-'0']=tmp;
            }
            p=p->next[s[i]-'0'];
            p->cnt++;
        }
    }
    bool findtrie(char *s){
        int len=strlen(s);
        node *p=root;
        for(int i=0;i<len;i++){
            p=p->next[s[i]-'0'];    
        }
        if(p->cnt!=1) return 0;
        return 1;
    }
    void del(node *root){
        for(int i=0;i<26;i++){
            if(root->next[i])
                del(root->next[i]);
        }
        delete(root);
    }
    int main()
    {
        scanf("%d",&t);
        while(t--){
            root = new node;
            scanf("%d",&n);
            for(int i = 1; i <= n; i++){
                scanf("%s",str[i]);
                buildtrie(str[i]);
            }
            int flag = 1;
            for(int i = 1; i <= n; i++){
                if(findtrie(str[i])==0){
                    flag = 0;
                    break;
                }
            }
            if(flag)
                printf("YES
    ");
            else
                printf("NO
    ");
            del(root);
        }
        return 0;
    
    }

     静态申请

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    const int maxn=1e4+5;
    char str[maxn][15];
    int cnt_node;
     
    struct node
    {
        int cnt;
        struct node *next[10];
        void init()
        {
            cnt = 0;
            memset(next,0,sizeof(next));
        }
    }Heap[maxn];
     
    inline node* new_node(){//根据cnt_node一个一个提供结点 
        Heap[cnt_node].init();
        return &Heap[cnt_node++];
    }
     
    node *root = NULL;
     
    void buildtrie(char *s)
    {
        node *p = root;
        node *tmp = NULL;
        int i,l = strlen(s);
        for(i = 0; i < l; i++)
        {
            if(p->next[s[i]-'0'] == NULL)
            {
                tmp = new_node();
                p->next[s[i]-'0'] = tmp;
            }
            p = p->next[s[i]-'0'];
            p->cnt++;
        }
    }
     
    bool findtrie(char *s)
    {
        node *p = root;
        int i,l = strlen(s);
        for(i = 0; i < l; i++){
            p = p->next[s[i]-'0'];
        } 
        if(p->cnt != 1)    return true;
        return false;
    }
     
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--){
            cnt_node = 0;
            root = new_node();
            int n;
            scanf("%d",&n);
            for(int i = 1; i <= n; i++){
                scanf("%s",str[i]);
                buildtrie(str[i]);
            }
            int flag = 1;
            for(int i = 1; i <= n; i++){
                if(findtrie(str[i])){
                    flag = 0;
                    break;
                }
            }
            if(flag)
                printf("YES
    ");
            else
                printf("NO
    ");
        }
        return 0;
    }
  • 相关阅读:
    SpringBoot标准化搭建
    springboot打开swagger文档遇到For input string: ""的报错 swagger版本2.9.2
    MySQL和Redis如何保证数据一致性? 三种方案对比,初版
    [转]QUdpSocket收发信息
    [原][C++][插件]window下C++简单插件机制实现
    php saas 架构设计,SaaS的几种架构解析
    如何处理将HTML打印出来中的断行,分页,修改打印内容等问题?急,谢谢!!
    批量打印 | 多页打印 | PHP多页打印
    web页面的单页打印以及批量打印实现方法
    php批量打印发票三(php用FPDF合并所有图片为PDF文档)
  • 原文地址:https://www.cnblogs.com/qq2210446939/p/13388148.html
Copyright © 2020-2023  润新知