zoukankan      html  css  js  c++  java
  • hdu 1251 前缀树

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1251

        普通trie树,只是在构建的时候统计出每个节点儿子的个数,最后直接匹配每个前缀,输出最后一个前缀字符在树中儿子的个数加一(其本身)即可。

        纠结的是题目没给数据范围,tree数组开100010 RE,开200010 还是RE,一狠心开了500010,果断AC。。。

    代码:

     

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    using namespace std ;
    int num ;
    int ans ;
    struct node{
        int n ;
        int next[30] ;
        void init(){
            memset(next,0,sizeof(next)) ;
            n=0 ;
        }
    }tree[500010] ;

    void insert(char a[]){
        int index=0 ;
        int len=strlen(a) ;
        for(int i=0;i<len;i++){
            if(tree[index].next[a[i]-'a']==0){
                tree[++num].init() ;
                tree[index].next[a[i]-'a']=num ;
                index=num ;
                tree[index].n=1 ;  //新节点没有儿子,但其本身也为本身的前缀
            }
            else{
                index=tree[index].next[a[i]-'a'] ;
                tree[index].n ++ ; //每匹配一个字符,儿子个数增一
            }
        }
    }
    int find(char a[]){
        int index=0 ;
        int len=strlen(a) ;
        if(len==0)  return 0 ;
        for(int i=0; i<len; i++){
            if(tree[index].next[a[i]-'a']==0)
                return 0 ;
            else
                index=tree[index].next[a[i]-'a'] ;
        }
        return tree[index].n ;
    }
    int main(){
        char str[15] ;
        int t=0 ;
        tree[0].init() ;
        num = 0 ;
        ans = 0 ;
        while(gets(str),strcmp(str,"")!=0)      //获取以空行区分的字符串
            insert(str) ;
        while(scanf("%s", str)!=EOF)
            cout << find(str) << endl ;
        return 0 ;
    }
  • 相关阅读:
    `cd -`
    .git文件夹过大的解决方法
    避免对函数参数的修改
    2020年10月 修改Ant Design Pro底部版权信息的方法
    度目-人脸应用套件 文档中的坑
    "A little like that j-thing"
    Linux安装MySQL后设置密码
    append对len和cap的影响
    s := []int{0, 1, 2, 3, 8: 100}
    Python学习笔记
  • 原文地址:https://www.cnblogs.com/xiaolongchase/p/2210729.html
Copyright © 2011-2022 走看看