zoukankan      html  css  js  c++  java
  • 统计难题(trie树)

    统计难题

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)
    Total Submission(s): 26206    Accepted Submission(s): 10637


    Problem Description
    Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
     
    Input
    输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.

    注意:本题只有一组测试数据,处理到文件结束.
     
    Output
    对于每个提问,给出以该字符串为前缀的单词的数量.
     
    Sample Input
    banana band bee absolute acm ba b band abc
     
    Sample Output
    2 3 1 0
    题解:找以串s为前缀的字母个数,trie树,第一道,数组开小了,显示超时,错了半天;
    字典树其实就是把下个字母当作过程,来往下查找,类似于哈希的思路;word代表当前前缀的个数
    代码:
     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstdio>
     4 #include<cstring>
     5 #include<cmath>
     6 #include<vector>
     7 #define mem(x,y) memset(x,y,sizeof(x))
     8 using namespace std;
     9 typedef long long LL;
    10 const int MAXN=1e6+10;
    11 char str[MAXN];
    12 int ch[MAXN][30];
    13 int word[MAXN];
    14 int sz;
    15 void insert(char *s){
    16     int len=strlen(s);
    17     int k=0,j;
    18     for(int i=0;i<len;i++){
    19         j=s[i]-'a';
    20         if(!ch[k][j]){
    21             mem(ch[sz],0);
    22             ch[k][j]=sz++;
    23         }
    24         k=ch[k][j];
    25         word[k]++;
    26     }
    27 }
    28 int find(char *s){
    29     int len=strlen(s);
    30     int k=0,j;
    31     for(int i=0;i<len;i++){
    32         j=s[i]-'a';
    33         if(!ch[k][j])return 0;
    34         k=ch[k][j];
    35     }
    36     return word[k];
    37 }
    38 int main(){
    39     sz=1;
    40     mem(ch[0],0);mem(word,0);
    41     while(gets(str),str[0]){
    42         insert(str);
    43     }
    44     while(~scanf("%s",str)){
    45         printf("%d
    ",find(str)); 
    46     }
    47     return 0;
    48 }
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace  std;
    typedef long long LL;
    #define mem(x,y) memset(x,y,sizeof(x))
    #define SI(x) scanf("%d",&x)
    #define PI(x) printf("%d",x)
    #define P_ printf(" ")
    const int INF=0x3f3f3f3f;
    const int MAXN=1000010;
    int ch[MAXN][30];
    int word[MAXN];
    int sz;
    void insert(char *s){
        int k=0,j;
        for(int i=0;s[i];i++){
            j=s[i]-'a';
            if(!ch[k][j]){
                mem(ch[sz],0);
                ch[k][j]=sz++;
            }
            k=ch[k][j];//注意不能要else 
            word[k]++;
        }
    }
    int find(char *s){
        int k=0,j;
        for(int i=0;s[i];i++){
            j=s[i]-'a';
            if(ch[k][j])k=ch[k][j];
            else return 0;
        }
        return word[k];
    }
    int main(){
        char s[15];
        sz=1;
        mem(word,0);mem(ch[0],0);
        while(gets(s)){
            if(s[0]!='')insert(s);
            else break;
        }
        while(gets(s)){
            printf("%d
    ",find(s));
        }
        return 0;
    }
  • 相关阅读:
    第37天新版动画系统和有限状态机
    第36天旧版动画系统
    第35天2D游戏相关
    第34天协同程序和异步加载
    第33天力、射线检测、球形检测和延迟函数
    第32天Line渲染器,物理系统和力
    第31天Camera组件和灯光组件
    第29天动态加载、对象池
    第28天3D数学
    第27天3D数学
  • 原文地址:https://www.cnblogs.com/handsomecui/p/4909317.html
Copyright © 2011-2022 走看看