首页 技术 正文
技术 2022年11月19日
0 收藏 983 点赞 2,844 浏览 2192 个字

统计难题

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)
Total Submission(s): 31479    Accepted Submission(s): 12087

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

注意:本题只有一组测试数据,处理到文件结束.

 Output对于每个提问,给出以该字符串为前缀的单词的数量. Sample Inputbanana
band
bee
absolute
acm

ba
b
band
abc

 Sample Output2 3 1 0字典树的典型应用,主要要会写建树和查找树的过程。遍树的时候要用dfs 我发现用指针写树很好写,所以就用指针了,哈哈下面是代码,字典树可以保存成模板,这个题让我长知识的是对于输入输出的限制,还有c++和G++对内存管理的机智不太一样,这个题就是用G++交的时候回抄内存,用c++交就过了然后输入的时候总结一下:因为是scanf(“%d”,&tm) 是不会读入最后的回车的,而scanf(“%c“,&ch)会读回车,所以在%d后面要是回车再读入%c的话要加getchar()scanf(“%s”,Str)是不会读入回车的,它会自动忽略回车,且到回车停止。所以如果输入需要读入回车的话需要用gets(); 这个题还可以用set的方法过掉,因为字符串不超过10所以可以直接就把每个字符串的所有前缀放到set里然后再处理字典树方法:

 #include <cstdio>
#include <cstring>
#include <malloc.h>
#include <iostream>
using namespace std;
#define MAXN 26
typedef struct Trie {
int v;//根据需要变化
Trie *next[MAXN];
//next是表示每层有多少种类的数,如果只是小写字母,则26即可,
//若改为大小写字母,则是52,若再加上数字,则是62了
} Trie;
Trie root; void createTrie(char *str) {
int len = strlen(str);
Trie *p = &root, *q;
for(int i = ; i < len; i++) {
int id = str[i]-'a';
if(p->next[id] == NULL) {
q = (Trie *)malloc(sizeof(root));
q->v = ;//初始v==1
for(int j = ; j < MAXN; j++)
q->next[j] = NULL;
p->next[id] = q;
p = p->next[id];
} else {
p->next[id]->v++;
p = p->next[id];
}
}
// p->v = -1;//若为结尾,则将v改成-1表示
} int findTrie(char *str) {
int len = strlen(str);
Trie *p = &root;
for(int i = ; i < len; i++) {
int id = str[i]-'a';
p = p->next[id];
if(p == NULL) //若为空集,表示不存以此为前缀的串
return ;
// if(p->v == -1) //字符集中已有串是此串的前缀
// return -1;
}
return p->v;
//return -1; //此串是字符集中某串的前缀
}
int dealTrie(Trie* T) {
//动态字典树,有时会超内存,这是就要记得释放空间了
if(T==NULL)
return ;
for(int i = ; i < MAXN; i++) {
if(T->next[i]!=NULL)
dealTrie(T->next[i]);
}
free(T);
return ;
}
int main() {
char str[];
for(int i = ; i < MAXN; i++)
root.next[i] = NULL;
while(gets(str) && str[]!='\0')
createTrie(str);
memset(str, , sizeof(str));
while(scanf("%s", str) != EOF) {
int ans = findTrie(str);
printf("%d\n", ans);
}
return ;
}

set方法:

 #include <cstdio>
#include <iostream>
#include <map>
#include <cstring>
#include <string>
using namespace std; int main()
{
char str[];
map<string, int> m;
while(gets(str))
{
int len = strlen(str);
if (!len)
{
break;
}
for(int i = len; i > ; i--)
{
str[i] = '\0';
m[str]++;
}
}
while(gets(str))
{
cout<<m[str]<<endl;
} return ;
}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,083
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,558
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,407
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,180
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,817
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,899