统计难题

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. 13. OPTIMIZER_TRACE

    13. OPTIMIZER_TRACE OPTIMIZER_TRACE表提供由跟踪语句的优化程序跟踪功能生成的信息. 要启用跟踪,请使用optimizer_trace系统变量. 有关详细信息,请参阅M ...

  2. Go:文件操作

    一.打开文件和关闭文件 os包File结构体的两个方法: func Open(name string) (file *File, err error) Open打开一个文件用于读取.如果操作成功,返回 ...

  3. Java:追加文件内容

    文章来源:https://www.cnblogs.com/hello-tl/p/9139367.html import java.io.*; public class FileBasicOperati ...

  4. mysql 常用命令(二)

    1.创建数据库,并制定默认的字符集是utf8. CREATE DATABASE IF NOT EXISTS yourdbname DEFAULT CHARSET utf8 COLLATE utf8_g ...

  5. Codeforces Round #211 (Div. 2)-D. Renting Bikes,二分!感谢队友出思路!

    D. Renting Bikes 读懂题后一开始和队友都以为是贪心.可是贪心又怎么贪呢..我们无法确定到底能买多少车但肯定是最便宜的前x辆.除了公共预算每个人的钱只能自己用,也无法确定每个人买哪一辆车 ...

  6. BZOJ 1924: [Sdoi2010]所驼门王的宝藏 【tarjan】

    Description 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为“先 知”的Alpaca L. Sotomon 是这个家族的领袖,外人也称其为“所驼门王”.所 驼门王毕生致力于维 ...

  7. 【BZOJ1834】network 网络扩容(最大流,费用流)

    题意:给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求: 1. 在不扩容的情况下,1到N的最大流: 2. 将1到N的最大流增加K所需的最小扩容费用. ...

  8. linux 常见名词及命令(一)

    linux  PK  wondows 稳定且有效率.免费或少许费用.漏洞少且修补快.多任务多用户. 安全的用户及文件权限策略.适合小内核程序的嵌入系统.相对不耗资源. 热门的开源系统 红帽企业系统(R ...

  9. union关键字和字节大小端序的确定

    union 关键字的用法与struct 的用法非常类似. union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在union 中所有的数据成员共用一个空间,同一时间 ...

  10. [Bzoj5179][Jsoi2011]任务调度(左偏树)

    5179: [Jsoi2011]任务调度 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 5  Solved: 4[Submit][Status][Di ...