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 ;
    }
  • 相关阅读:
    MySQL 初识别语句,数据库、表、行的增删改查
    mysql如何从全备文件中恢复单个库或者单个表
    Shell 同步时间脚本
    app手机端连接tomcat电脑端服务器
    大于号转义符&gt;---小于号转义符&lt;
    轻松实现页面提交中
    重复提交问题(一)
    json
    ExtJs 6.0+快速入门,ext-bootstrap.js文件的分析,各版本API下载(一)
    ExtJS 6 如何引入Dashboard模版
  • 原文地址:https://www.cnblogs.com/xiaolongchase/p/2210729.html
Copyright © 2011-2022 走看看