统计难题

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. redhat 7.x 、redhat 6.x查看硬盘UUID方法

    1.查看磁盘分区UUID: [root@rac01 ~]# blkid /dev/sdb1: UUID="6bba92c4-0b25-4cc4-9442-ca87c563720a" ...

  2. C语言学习9

    婚礼的谎言 三对情侣参加婚礼,三个新郎为A.B.C,三个新娘为X.Y.Z.有人想知道究竟水域谁结婚2,于是就问新人中的三位,得到结果如下:A说他将和X结婚:X说她的未婚夫是C:C说他将和Z结婚.这人事 ...

  3. nginx启动、重启、关闭、升级

    一.启动 cd usr/local/nginx/sbin ./nginx 二.重启 更改配置重启nginx kill -HUP 主进程号或进程号文件路径 或者使用 cd /usr/local/ngin ...

  4. 火狐插件youdao word capturer无法删除。

    []火狐插件youdao word capturer无法删除.       魔芋记录一下:   []一直无法删除,就网上找了下.   网上解释说是:有道词典自己安装的插件,所以火狐无法管理. 用来帮助 ...

  5. xtu read problem training A - Dividing

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

  6. HDU-1020-Encoding,题意不清,其实很水~~

    Encoding Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) http:// ...

  7. SPOJ GNYR09F 数字上的找规律DP

    Problem C      SPOJ GNYR09F dp题,dp可能刚刚开始对大家来说比较难,但是静下心来分析还是比较简单的: dp(i ,j ,k)表示前i个数中,当前累积和为j,末尾数字为k的 ...

  8. hdu 1421经典dp

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

  9. 怎样检查Android网络连接状态

    在发送任何HTTP请求前最好检查下网络连接状态,这样可以避免异常.这个教程将会介绍怎样在你的应用中检测网络连接状态. 创建新的项目 1.在Eclipse IDE中创建一个新的项目并把填入必须的信息.  ...

  10. Java调用K3Cloud的密码加密算法实现登录密码检验

    背景: 最近要开始做K3Cloud移动,BOS平台的移动单据收费,就想单独做移动模块,搭建环境:后台SSH2,前端Android.在手机端登录时通过Ajax方式传递用户名和密码到后台校验,后台在去K3 ...