zoukankan      html  css  js  c++  java
  • 字典树(POJ 2503)

    它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。
    
    它有3个基本性质:
    根节点不包含字符,除根节点外每一个节点都只包含一个字符; 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串; 每个节点的所有子节点包含的字符都不相同。
    
    
    #include <iostream>
    #include<cstring>
    #include<cstdio>
    
    using namespace std;
    
    const int M=1000000;
    char word[100000][11];
    int wp;
    struct node
    {
       int next[26];
        int value;
        bool end;
    }tree[M];
    
    int pi=1;
    
    void init()   //初始化
    {
        memset(tree,0,sizeof(tree));          //将一个数组全部元素赋成0      //只能是-1和0
        pi=1;
        wp=0;
    }
    
    void insert(char * keyword,int value)  //建树
    {
        int index,p,i;
        for(i=p=0;keyword[i];i++)
        {
            index=keyword[i]-'a';   //
             if(tree[p].next[index]==0)     //
                 tree[p].next[index]=pi++;
    
               p=tree[p].next[index];
        }
        tree[p].value=value;
         tree[p].end=1;
    }
    
      bool query(char * keyword,int& value)
      {
            int index,p,i;
            for(i=p=0;keyword[i];i++)
            {
                index=keyword[i]-'a';
                 if(tree[p].next[index]==0)
                      return 0;
                    p=tree[p].next[index];
            }
            if(tree[p].end)
            {
                value=tree[p].value;
                return 1;
            }
            return 0;
      }
    
      int main()
      {
          char s1[15],s2[15],s[30];
           int i,value;
            while(gets(s))
            {
                if(!strlen(s))  //有字母就不跳出
                break;
    
                for(i=0;i<strlen(s);i++)
                {
                    if(s[i]==' ')   //空格
                        break;
                }
                strncpy(s1,s,i);   //把s的前i位复制给s1
                s1[i]=0;
                strcpy(s2,s+i+1);   //把s的i位之后复制给s2
                strcpy(word[wp],s1); //
                   insert(s2,wp++);   //
            }
              while(scanf("%s",s)!=EOF)
              {
                  if(query(s,value))      //到相应字母 然后输出
                     printf("%s
    ",word[value]);
                   else
                    printf("eh
    ");  //没找到输出eh
              }
           return 0;
      }
  • 相关阅读:
    《Java算法》Java贪心算法
    《Java知识应用》Java下Linux系统下word转PDF
    《MySQL数据库》MySQL常用语法(二)
    《MySQL数据库》MySQL常用语法(一)
    《Java算法》Java判重算法-整数判重
    《Java算法》Java排序算法-快速排序
    POJ 1113:Wall
    POJ 1584:A Round Peg in a Ground Hole
    51nod 1035:最长的循环节
    51nod 1022 石子归并 环形+四边形优化
  • 原文地址:https://www.cnblogs.com/xiao-xue-di/p/9400857.html
Copyright © 2011-2022 走看看