CSU - 1115 最短的名字(字典树模板题)

http://acm.csu.edu.cn/OnlineJudge/problem.php?cid=2081&pid=15

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cmath>
  4 #include <vector>
  5 #include <cstring>
  6 #include <string>
  7 #include <algorithm>
  8 #include <string>
  9 #include <set>
 10 #include <functional>
 11 #include <numeric>
 12 #include <sstream>
 13 #include <stack>
 14 #include <map>
 15 #include <queue>
 16 #pragma comment(linker, "/STACK:102400000,102400000")
 17 #define CL(arr, val)    memset(arr, val, sizeof(arr))
 18
 19 #define ll long long
 20 #define inf 0x7f7f7f7f
 21 #define lc l,m,rt<<1
 22 #define rc m + 1,r,rt<<1|1
 23 #define pi acos(-1.0)
 24
 25 #define L(x)    (x) << 1
 26 #define R(x)    (x) << 1 | 1
 27 #define MID(l, r)   (l + r) >> 1
 28 #define Min(x, y)   (x) < (y) ? (x) : (y)
 29 #define Max(x, y)   (x) < (y) ? (y) : (x)
 30 #define E(x)        (1 << (x))
 31 #define iabs(x)     (x) < 0 ? -(x) : (x)
 32 #define OUT(x)  printf("%I64d\n", x)
 33 #define lowbit(x)   (x)&(-x)
 34 #define Read()  freopen("a.txt", "r", stdin)
 35 #define Write() freopen("b.txt", "w", stdout);
 36 #define maxn 1010
 37 #define maxv 1010
 38 #define mod 1000000000
 39 using namespace std;
 40
 41 typedef struct node
 42 {
 43     int count;
 44     struct node *next[26];
 45 }*tree;
 46
 47 void insert(tree h,char *s)
 48 {   //每一个节点保存的都是每一个字母出现的次数。
 49     tree p=h;
 50     int len=strlen(s);
 51     for(int i=0;i<len;i++)
 52     {
 53         int index=s[i]-‘a‘;
 54         if(p->next[index]!=NULL)
 55         {
 56             p=p->next[index];
 57             p->count++;
 58         }
 59         else
 60         {
 61             tree tem=(tree)calloc(1,sizeof(node));
 62             tem->count=1;
 63             p->next[index]=tem;
 64             p=tem;
 65         }
 66     }
 67 }
 68
 69 int find(tree h)
 70 {   //查找不为空的结点,加上相应的次数,如果count值大于1,则说明有分支,需继续查找下去
 71     tree p=h;
 72     int sum=0,i;
 73     for(int i=0;i<26;i++)
 74     {
 75         if(h->next[i]!=NULL)
 76         {
 77             p=h->next[i];
 78             sum+=p->count;
 79             if(p->count>1) sum+=find(p);
 80         }
 81     }
 82     return sum;
 83 }
 84
 85 char s[1000];
 86
 87 int main()
 88 {
 89     //freopen("a.txt","r",stdin);
 90     int t,n;
 91     scanf("%d",&t);
 92     while(t--)
 93     {
 94         scanf("%d",&n);
 95         tree head=(tree)calloc(1,sizeof(node));
 96         while(n--)
 97         {
 98             scanf("%s",s);
 99             insert(head,s);
100         }
101         printf("%d\n",find(head));
102         free(head);
103     }
104     return 0;
105 }
时间: 2024-11-01 01:45:32

CSU - 1115 最短的名字(字典树模板题)的相关文章

字典树模板题 POJ 2503

1 #include <cstdio> 2 #include <cstring> 3 4 char en[11],fr[11]; 5 int st; 6 struct Tire{ 7 int next[26]; 8 char eng[11]; 9 }node[200005]; 10 void insert(char *s,int cur) 11 { 12 if(*s){ 13 if(!node[cur].next[*s-'a']) 14 node[cur].next[*s-'a']

HDU 1251 统计难题(字典树模板题)

http://acm.hdu.edu.cn/showproblem.php?pid=1251 题意:给出一些单词,然后有多次询问,每次输出以该单词为前缀的单词的数量. 思路: 字典树入门题. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 const int maxn = 1000005; 6 7 int num = 0; 8 9 struct Tr

HDU 1251 统计难题(字典树模板题 || map运用)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1251 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Input 输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一

(模板)hdoj1251(字典树模板题)

题目链接:https://vjudge.net/problem/HDU-1251 题意:给定一系列字符串之后,再给定一系列前缀,对每个前缀查询以该字符串为前缀的字符串个数. 思路: 今天开始学字典树,从入门题开始.用数组实现,count数组表示每个结点出现次数,trie[0]为根节点.插入和查询一个字符串的复杂度为O(len).len为字符串的长度. AC code: #include<cstdio> #include<algorithm> #include<cstring&

CSU 1115 最短的名字

传送门 Time Limit: 5000MS   Memory Limit: 65536KB   64bit IO Format: %lld & %llu Description 在一个奇怪的村子中,很多人的名字都很长,比如aaaaa, bbb and abababab. 名字这么长,叫全名显然起来很不方便.所以村民之间一般只叫名字的前缀.比如叫'aaaaa'的时候可以只叫'aaa',因为没有第二个人名字的前三个字母是'aaa'.不过你不能叫'a',因为有两个人的名字都以'a'开头.村里的人都很

hdu 1251 字典树模板题 ---多串 查找单词出现次数

这道题题目里没有给定数据范围 我开了2005  疯狂的WA 然后开了50000, A掉  我以为自己模板理解错  然后一天没吃饭,饿得胃疼还是想着把这题A掉再去吃,谁知竟然是这样的问题,,,呵呵~~~ 只是记录下这道题学到的方法吧: for(rt = 0; *s; rt = nxt, ++s) { nxt=tree[rt][*s-tb]; if(!nxt) { nxt=tree[rt][*s-tb]=top; memset(tree[top],0,sizeof(tree[top])); top+

hdu--1251 统计难题(字典树水题)

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

CSU OJ 1115 最短的名字(字典树——湖南省第八届大学生计算机程序设计竞赛)

 1115: 最短的名字 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 141  Solved: 56 [Submit][Status][Web Board] Description 在一个奇怪的村子中,很多人的名字都很长,比如aaaaa, bbb and abababab. 名字这么长,叫全名显然起来很不方便.所以村民之间一般只叫名字的前缀.比如叫'aaaaa'的时候可以只叫'aaa',因为没有第二个人名字的前三个字母是'aaa'.不过你不能

字典树模板 [HDU 1251] 统计难题

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