统计难题

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)

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



注意:本题仅仅有一组測试数据,处理到文件结束.
 
Output
对于每一个提问,给出以该字符串为前缀的单词的数量.
 
Sample Input
banana
band
bee
absolute
acm ba
b
band
abc
 
Sample Output
2
3
1
0

Trie树入门题,做的时候碰到了不少问题。首先是Ctrl+Z没法结束程序。又一次编译又时好时坏。莫名其妙。CB和DEV都这样。然后就是忘记malloc函数分配的变量单元是随机值。这两点攻克了就好办了。

#include <stdio.h>
#include <string.h>
#include <stdlib.h> struct Node{
struct Node *nextAlph[26];
int num;
} root; void insert(char *str)
{
Node *p = &root;
int id;
while(*str){
id = *str - 'a';
if(p->nextAlph[id] == NULL){
p->nextAlph[id] = (Node *)malloc(sizeof(Node));
p = p->nextAlph[id];
memset(p->nextAlph, 0, sizeof(p->nextAlph));
p->num = 0;
}else p = p->nextAlph[id]; ++p->num; ++str;
}
} int FIND(char *str)
{
Node *p = &root;
int id;
while(*str){
id = *str - 'a';
if(p->nextAlph[id] == NULL) return 0;
p = p->nextAlph[id];
++str;
}
return p->num;
} int main()
{
//freopen("stdin.txt", "r", stdin);
char str[12];
while(gets(str), *str) insert(str);
while(gets(str) != NULL) printf("%d\n", FIND(str));
return 0;
}

粘一个典型的错误代码:用数组错误地模拟trie树,忽略了aaa\nbbb\n\nab这样的情况.

#include <stdio.h>
#include <string.h> bool alpha[12][26];
int num[12][26]; void insert(char *str)
{
int id, i;
for(i = 0; str[i]; ++i){
id = str[i] - 'a';
alpha[i][id] = true;
++num[i][id];
}
} int getNum(char *str)
{
int id, i;
for(i = 0; str[i]; ++i){
id = str[i] - 'a';
if(alpha[i][id] == false) return 0;
}
return num[i - 1][id];
} int main()
{
//freopen("stdin.txt", "r", stdin);
char str[12];
while(gets(str), *str) insert(str);
while(gets(str)) printf("%d\n", getNum(str));
return 0;
}

2014.12.16更新

#include <stdio.h>
#include <string.h> #define maxNode 1000000 char str[12];
struct Trie {
int ch[maxNode][26];
int val[maxNode], sz; Trie() {
memset(ch[0], 0, sizeof(ch[0]));
sz = 1;
}
int idx(char ch) { return ch - 'a'; }
void insert(char *str) {
int u = 0, id, i, len = strlen(str);
for (i = 0; i < len; ++i) {
id = idx(str[i]);
if (!ch[u][id]) {
memset(ch[sz], 0, sizeof(ch[sz]));
val[sz] = 0;
ch[u][id] = sz++;
}
u = ch[u][id];
++val[u];
}
}
int find(char *str) {
int u = 0, id, i, len = strlen(str);
for (i = 0; i < len; ++i) {
id = idx(str[i]);
if (ch[u][id]) u = ch[u][id];
else break;
}
return i == len ? val[u] : 0;
}
} T; int main() {
// freopen("stdin.txt", "r", stdin);
while(gets(str), *str)
T.insert(str);
while(gets(str))
printf("%d\n", T.find(str));
return 0;
}

HDU1251 统计难题 【trie树】的更多相关文章

  1. HDU1251 统计难题 Trie树

    题目很水,但毕竟是自己第一道的Trie,所以还是发一下吧.Trie的更多的应用慢慢学,AC自动机什么的也慢慢学.... #include<iostream> #include<cst ...

  2. HDU1251 统计难题 trie树 简单

    http://acm.hdu.edu.cn/showproblem.php?pid=1251 题意: 找前缀数量 裸模板 #include<cstdio> #include<cstr ...

  3. HDU - 1251 统计难题(trie树)

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

  4. HDU-1251 统计难题,字典树或者map!

    统计难题 很久就看过这个题了,但不会~~~不会~~ 题意:给出一张单词表,然后下面有若干查询,每次给出一个单词,问单词表中是否存在以这个单词为前缀的单词,输出数量.本身也是自身的前缀.只有一组数据! ...

  5. hdu 1251 统计难题(trie树入门)

    统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submi ...

  6. hdu1251 统计难题 字典树

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

  7. [hdu1251]统计难题(trie模板题)

    题意:返回字典中所有以测试串为前缀的字符串总数. 解题关键:trie模板题,由AC自动机的板子稍加改造而来. #include<cstdio> #include<cstring> ...

  8. HDU1251统计难题---Trie Tree

    map巧过 #include <stdio.h> #include <string.h> #include <map> #include <string> ...

  9. HDU 1251 统计难题 字典树大水题

    今天刚看的字典树, 就RE了一发, 字典树原理还是很简单的, 唯一的问题就是不知道一维够不够用, 就开的贼大, 这真的是容易MLE的东西啊, 赶紧去学优化吧. HDU-1251 统计难题 这道题唯一的 ...

随机推荐

  1. 实现验证的vsftpd虚拟用户

    实现基于文件验证的vsftpd虚拟用户--(一台) 一.创建用户数据库文件 vim /etc/vsftpd/vuser cd /etc/vsftpd/ db_load -T -t hash -f vu ...

  2. pandas.read_csv 报ssl.SSLError

  3. python基础知识09-继承,多继承和魔术方法

    1.继承 class Father: def init(self,age,sex): self.age = age self.sex = sex class Son(Father): 类名后面写括号, ...

  4. (二十二)python 3 sort()与sorted()

    Python list内置sort()方法用来排序,也可以用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列 一,最简单的排序 1.使用sort排序 my_list = [3 ...

  5. FTS5与DIY

    此文已由作者王荣涛授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. FTS5简介 前文已经介绍了FTS3/FTS4,本文着重介绍它们的继任者FTS5. FTS5是在SQLite ...

  6. xtu read problem training A - Dividing

    A - Dividing Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Descri ...

  7. [BZOJ2120][BZOJ2453]数颜色

    [BZOJ2120]数颜色 试题描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中 ...

  8. hdu 1421经典dp

    #include<stdio.h> #include<stdlib.h> #define N 2001 #define inf 0x3fffffff int a[N],dp[N ...

  9. Foundation框架的一些实用方法:替换字符串,去空格,反转

    //定义一个可变字符串, Format后面可以跟字符串类型,也可以传入C语言的字符串数组 NSMutableString *str = [NSMutableString stringWithForma ...

  10. BZOJ2097: [Usaco2010 Dec]Exercise 奶牛健美操

    n<=100000的树,砍S<n条边,求砍完后S+1棵树的最大直径的最小值. 树的直径要小小哒,那考虑一棵子树的情况吧!一棵子树的直径,就是子树根节点各儿子的最大深度+次大深度.就下面这样 ...