• (trie)HDU1251 统计难题


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

    Input输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串. 

    注意:本题只有一组测试数据,处理到文件结束. 
    Output对于每个提问,给出以该字符串为前缀的单词的数量. 
    Sample Input

    banana
    band
    bee
    absolute
    acm
    
    ba
    b
    band
    abc

    Sample Output

    2
    3
    1
    0

    完完全全的trie裸题,不过要注意数组(或map)的大小,防止MLE。

     1 #include <iostream>
     2 #include <string>
     3 #include <algorithm>
     4 #include <cstring>
     5 #include <cstdio>
     6 #include <cmath>
     7 #include <queue>
     8 #include <set>
     9 #include <map>
    10 #include <list>
    11 #include <vector>
    12 #include <stack>
    13 #define mp make_pair
    14 //#define P make_pair
    15 #define MIN(a,b) (a>b?b:a)
    16 //#define MAX(a,b) (a>b?a:b)
    17 typedef long long ll;
    18 typedef unsigned long long ull;
    19 const int MAX=1e6+5;
    20 const int MAX_V=1e3+5;
    21 const ll INF=4e18+5;
    22 const double M=4e18;
    23 using namespace std;
    24 const int MOD=1e9+7;
    25 typedef pair<ll,int> pii;
    26 const double eps=0.000000001;
    27 #define rank rankk
    28 map<int,int>ch[MAX];
    29 int val[MAX];
    30 struct Trie
    31 {
    32     int num;
    33     Trie(){num=1;}
    34     int idx(char x)
    35     {
    36         return x-'a';
    37     }
    38     void clear()
    39     {
    40         num=1;
    41     }
    42     void insert(char *s)
    43     {
    44         int u=0,len=strlen(s);
    45         for(int i=0;i<len;i++)
    46         {
    47             int c=idx(s[i]);
    48             if(!ch[u][c])
    49             {
    50                 val[num]=0;
    51                 ch[u][c]=num++;
    52             }
    53             u=ch[u][c];
    54             ++val[u];
    55         }
    56     }
    57     int check(char *s)
    58     {
    59         int u=0,len=strlen(s);
    60         for(int i=0;i<len;i++)
    61         {
    62             int c=idx(s[i]);
    63             if(!ch[u][c])
    64                 return 0;
    65             u=ch[u][c];
    66         }
    67         return val[u];
    68     }
    69 };
    70 char a[300];
    71 int main()
    72 {
    73     Trie dic;
    74     while(1)
    75     {
    76         gets(a);
    77         if(strlen(a)==0)
    78             break;
    79         dic.insert(a);
    80     }
    81     while(scanf("%s",a)!=EOF)
    82     {
    83         printf("%d
    ",dic.check(a));
    84     }
    85 }
  • 相关阅读:
    centos7 安装 nginx
    centos7 安装 mysql
    centos7 安装 python3.7
    nginx添加到系统命令中
    Java多线程6-线程让步
    Java多线程5-线程等待与唤醒
    Java多线程4-synchronized关键字
    Java多线程3-Thread中start和run方法的区别
    Java多线程-2-常用的实现多线程的两种方式
    java多线程1-基础概念
  • 原文地址:https://www.cnblogs.com/quintessence/p/6947278.html
Copyright © 2020-2023  润新知