当前位置: 首页 > news >正文

统计难题(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\n",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]!='\0')insert(s);
        else break;
    }
    while(gets(s)){
        printf("%d\n",find(s));
    }
    return 0;
}

 

相关文章:

  • 爱上MVC3系列~Razor页面中的共享namespace不起作用了(解决自定义扩展方法不能识别的问题)...
  • js或jquery实现页面打印可局部打印
  • Windows 8 Relase Preview的安装
  • mysql授权新的用户时遇到的一个坑
  • Linux makefile 教程 [转]
  • 挚友的考研心得(二)
  • centos6.2LAMP源码环境 安装wordpress
  • NuGet学习笔记(1)——初识NuGet及快速安装使用
  • 网站优化之基本要素
  • Git 使用指南
  • Android ndk移植c库libpng
  • struts2拦截器的实现原理及源码剖析
  • 前端代码标准最佳实践:javascript篇
  • Android GPS GPSBasics project hacking
  • Touch Handling in Cocos2D 3.x(一)
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • [笔记] php常见简单功能及函数
  • 2017年终总结、随想
  • Git学习与使用心得(1)—— 初始化
  • gops —— Go 程序诊断分析工具
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Python利用正则抓取网页内容保存到本地
  • spring + angular 实现导出excel
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • 从零开始在ubuntu上搭建node开发环境
  • 实现菜单下拉伸展折叠效果demo
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 世界上最简单的无等待算法(getAndIncrement)
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 主流的CSS水平和垂直居中技术大全
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • # 数论-逆元
  • #QT(一种朴素的计算器实现方法)
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (C语言)共用体union的用法举例
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (五)关系数据库标准语言SQL
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • (转载)Linux网络编程入门
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .Net 4.0并行库实用性演练
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET Reactor简单使用教程
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .vue文件怎么使用_vue调试工具vue-devtools的安装