poj 1251 统计难题(字典树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1251

AC代码:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<queue>
 6 #include<string>
 7 #include<cmath>
 8 using namespace std;
 9 char ss[1010][1010];
10 #define MAX 26
11 typedef struct  trie
12 {
13     trie *next[MAX];
14     int  v;
15 };
16 trie root;
17 void creattrie(char *str)
18 {
19     int len = strlen(str);
20     trie *p = &root,*q;
21     for(int i=0;i<len; i++)
22     {
23         int id = str[i] - ‘a‘;
24         if(p->next[id] == NULL)
25         {
26             q=new trie;
27             q->v = 1;
28             for(int j=0; j<MAX; j++)
29                 q->next[j] = NULL;
30             p->next[id] = q;
31             p=p->next[id];
32         }
33         else
34         {
35             //printf("id = %d %d\n",id,p->next[id]->v);
36             p->next[id]->v+=1;
37             //printf("id = %d %d\n",id,p->next[id]->v);
38             p=p->next[id];
39         }
40     }
41 }
42 int findtrie(char *str)
43 {
44     int i;
45     int len = strlen(str);
46     trie *p = &root;
47     for(i=0;i<len;i++)
48     {
49         //printf("asss\n");
50         int id = str[i] - ‘a‘;
51         p=p->next[id];
52         if(p->v == 1)
53             return i+1;
54     }
55     return i;
56 }
57 int main()
58 {
59 int T,n,ans;
60 scanf("%d",&T);
61 while(T--)
62 {
63     ans = 0;
64     for(int i=0;i<MAX;i++)
65     {
66         root.next[i] = NULL;
67     }
68     scanf("%d",&n);
69
70     getchar();
71     for(int i=0;i<n;i++)
72     {
73         gets(ss[i]);
74         creattrie(ss[i]);
75     }
76     memset(ss,0,sizeof(ss));
77     for(int i=0;i<n;i++)
78     {
79         int kk = findtrie(ss[i]);
80         //printf("kk = %d\n",kk);
81         ans = ans+kk;
82     }
83     printf("%d\n",ans);
84 }
85   return 0;
86 }
时间: 2024-07-29 02:37:51

poj 1251 统计难题(字典树)的相关文章

hdu 1251 统计难题 字典树

// hdu 1251 统计难题 字典树 // // 题目大意: // // 有一系列的单词表,以空行结尾,之后会有一些字母串,找出以这些字符串 // 作为前缀的单词的个数 // // // 解题思路: // // 字典树 Trie,在插入字符串的时候每遇到一个节点,该节点的值++.查找的时候 // 字符串时,如果找到了,那么返回当前的val,否则返回0,因为没有以这个字符串 // 为前缀的单词. // // // 感悟: // // 这段时间想学学数据结构,就看了看刘老的大白书,感觉用数组挺巧

hdu 1251 统计难题 (字典树入门题)

1 /******************************************************* 2 题目: 统计难题 (hdu 1251) 3 链接: http://acm.hdu.edu.cn/showproblem.php?pid=1251 4 算法: 字典树 5 提示: 这题压要用c++提交,G++会超内存 6 *******************************************************/ 7 #include<cstdio> 8

HDU 1251 统计难题(字典树)

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

HDOJ/HDU 1251 统计难题(字典树啥的~Map水过)

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

hdoj 1251 统计难题(字典树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1251 思路分析:该问题要求求出以某个字符串为前缀的单词数目,通过使用字典树,在字典树中添加count记录通过该结点的单词数目即可: 查找时找到前缀的最后一个单词的结点的count值即为所求: 代码如下: #include <cstdio> #include <cstring> #include <iostream> using namespace std; const in

hdu 1251 统计难题 字典树水题

统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others) Total Submission(s): 19627    Accepted Submission(s): 8612 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的

POJ 1251 统计难题(初学字典树)

今天就这题照着别人的代码学了字典树... 这篇论文:http://wenku.baidu.com/view/d2ba836fb84ae45c3b358ca8.html介绍了各种字典树的运用,长了好多姿势,很有启发性 归纳一下字典树的应用: 检索(主要功能) 串排序 在DP中减少无效的状态转移 最长公共前缀问题(LCP)转化成LCA tire+KMP 构成AC自动机数据结构 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的

hdu_1251统计难题(字典树Trie)

统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submission(s): 31479    Accepted Submission(s): 12087 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的

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

统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submission(s): 24521    Accepted Submission(s): 10133 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的

HDU-1251统计难题 ,字典树

题意:问许多单词中,前缀是某个字符串的个数有多少个: 思路:  用字典树建立,每个节点带上num,记录每次insert是,经过这个点的次数, 每次询问,找到这个前缀对应的节点的num就ok 这道题,c++过,g++不行 ac代码: #include <iostream> #include <cstring> #include <algorithm> #include <string> #include <cstdio> using namespa