• 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 ;
    }
  • 相关阅读:
    IntelliJ IDEA AndroidStudio SVN无法使用
    三极管封装
    STC等单片机一开机就停电模式烧写程序办法
    CC2541设置中断输入模式
    C# WinForm 多线程 应用程序退出的方法 结束子线程
    CorelDrawX8安装时提示已安装另一个版本
    Win10下Prolific USB-to-Serial Comm Port驱动提示不能使用
    Keil5创建GPIO
    SQL行列转置
    Excel复制粘贴假死
  • 原文地址:https://www.cnblogs.com/xiaolongchase/p/2210729.html
Copyright © 2020-2023  润新知