zoukankan      html  css  js  c++  java
  • HDU1251

    题目大意

    Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).

    题解

    把单词插入到Trie树中,Trie树的每个结点记录以此结点结尾的单词前缀出现的次数,每次把进行单词插入的时候把沿途经过的结点+1即可

    代码:

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    const int maxnode=3000005;
    const int sigma_size=26;
    struct Trie
    {
           int ch[maxnode][sigma_size];
           int  val[maxnode];
           int sz;
           Trie(){sz=1;memset(val,0,sizeof(val));memset(ch[0],0,sizeof(ch[0]));}
           int idx(char c){return c-'a';}
           void insert(char *s)
           {
                 int u=0,n=strlen(s);
                 for(int i=0;i<n;i++)
                 {
                        int c=idx(s[i]);
                        if(!ch[u][c])
                        {
                            memset(ch[sz],0,sizeof(ch[sz]));
                            val[sz]++;
                            ch[u][c]=sz++;
                        }
                        else
                        val[ch[u][c]]++;
                        u=ch[u][c];
                 }
           }
           int find_prefixes(const char *s)
           {
                int u=0,n=strlen(s);
                for(int i=0;i<n;i++)
                {
                    int c=idx(s[i]);
                      if(!ch[u][c]) return 0;
                      u=ch[u][c];
                }
                return val[u];
           }
    };
    Trie trie;
    int main()
    {
        char word[15];
        while(gets(word)&&word[0]!='')
             trie.insert(word);
        while(scanf("%s",word)!=EOF)
              printf("%d
    ",trie.find_prefixes(word));
        return 0;
    }

  • 相关阅读:
    list和set的区别
    tcp与udp协议的区别
    c3p0的数据库连接池
    mysql的连接
    HAVING 的使用 及笛卡尔积
    break-跳出内循环
    求素数(范围自改)
    1-100累加
    1-100累乘
    类实例:飞机大战
  • 原文地址:https://www.cnblogs.com/zjbztianya/p/3317922.html
Copyright © 2011-2022 走看看