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 ;
    }
  • 相关阅读:
    购物网站数据库表
    C#Excel的导入与导出
    DataTable过滤重复字段
    压力测试~一套完整的压力测试项目文档
    压力测试~测试工具的使用
    C#调用本机摄像头
    linq学习笔记
    EasyPlayer RTSP播放器对RTSP播放地址url的通用兼容修改意见
    我们计划为EasyDSS定制开发一款超低延时的EasyPlayer Flash播放器
    EasyRTMP+EasyDSS实现一套完整的紧急视频回传直播与存储回放方案
  • 原文地址:https://www.cnblogs.com/xiaolongchase/p/2210729.html
Copyright © 2011-2022 走看看