当前位置:首页 > 芯闻号 > 充电吧
[导读]题面:统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Su

题面:


统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)
Total Submission(s): 25921    Accepted Submission(s): 10560


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

注意:本题只有一组测试数据,处理到文件结束.
 
Output 对于每个提问,给出以该字符串为前缀的单词的数量.
 
Sample Input


banana band bee absolute acm ba b band abc  
Sample Output


2 3 1 0


题意:

   额,中文大家都懂。


解题:

    字典树裸题,val值统计经过该点的字母数量。


代码:


#include#include#include#includeusing namespace std;
struct Trie
{
	//用来储存该节点的26个字母下标,ch的第一维要注意,要开大,不然会T 
	int ch[1000010][26];
	//val数组一般用来存储权值,视题目灵活运用,sz是当前节点数量
	int val[1000010],sz;
	//初始化
	void init()
	{
		sz=1;
		memset(ch[0],0,sizeof(ch[0]));
	}
	//插入一条单词
	void insert(string s)
	{
		//u是节点编号,并不是层数
		int u=0,len=s.length();
		for(int i=0;i<len;i++)
		{
			//取下标
			int c=(s[i]-'a');
			//如果该节点不存在,创建该节点
			if(!ch[u][c])
			{
				//真的是相当的省
				memset(ch[sz],0,sizeof(ch[sz]));
				//因为刚创建所以为1
				val[sz]=1;
				//给该节点分配编号
				ch[u][c]=sz++;
				//下移
				u=ch[u][c];
			}
			//已经存在了
			else
			{
			  //下移,并计数值加一
			  u=ch[u][c];
		      val[u]++;
			}
		}
	}
	//查询前缀
	int query(string s)
	{
		int len=s.length(),u=0,c;
		//不断下移,直至移到给定的前缀的最后一个单词
		bool sign=true;
		for(int i=0;i<len;i++)
		{
		   c=s[i]-'a';
		   if(ch[u][c])
             u=ch[u][c];
           else
           {
              sign=false;
              break;
           }
		}
		if(sign)
          return val[u];
        else
          return 0;
	}
};
Trie T;
int main()
{
        string s;
        T.init();
        while(getline(cin,s))
        {
           if(s=="")break;
           T.insert(s);
        }
        while(getline(cin,s))
        {
           cout<<T.query(s)<<endl;
        }
	    return 0;
}



本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

南京2022年10月27日 /美通社/ -- 10月18日,由南瑞集团主导编制的IEC国际标准《电动汽车充电漫游服务信息交互 第2部分:用例》(IEC 63119-2:2022)正式发布。该标准的发布是南瑞集团在国际电动...

关键字: 电动汽车充电 充电站 数据结构 电动汽车电池

大家都听说过红黑树,也都知道红黑树很厉害,是计算机里面评价非常高的数据结构。但是每当想学习红黑树的时候,却总是找不到通俗易懂很好理解的学习资料。很多书上上来就是红黑树的定义,然后就是红黑树的实现,直接就把人给整晕了。光看...

关键字: 计算机 数据结构 红黑树

(全球TMT2022年7月11日讯)7月7日,由径硕科技(JINGdigital)主办、MEC睿达会承办的“万数有灵·2022中国数字营销创新增长峰会”在深圳举行。作为一家营销科技公司,径硕科技提供的是一流的营销软件产...

关键字: CE DIGITAL 数字化 数据结构

Redis为什么那么快?除了它是内存数据库,使得所有的操作都在内存上进行之外,还有一个重要因素,它实现的数据结构,使得我们对数据进行增删查改操作时,Redis能高效的处理。因此,这次我们就来好好聊一下Redis数据结构,...

关键字: 数据结构 REDIS 字符串 节点

哈喽,大家好,我是瓜哥,致力于分享互联网各领域干货。前几天,有人问瓜哥,学习编程语言有什么好的建议没?今天简单和大家分享几点学习编程的建议,希望可以帮助到大家。1.只要开始,就不要怕晚瓜哥经常看到这些问题,大四学编程还来...

关键字: 编程 代码 基础知识 数据结构

模块化是指解决一个复杂问题时自顶向下逐层把系统划分成若干模块的过程,有多种属性,分别反映其内部特性。

关键字: 模块化 软件模块 数据结构

大家好,我是小林。前几天发了一篇「为了拿捏Redis数据结构,我画了20张图」,收获了很多好评,但是当时急于发文,有些地方没有写完,也有些地方写的不是很完善。然后我最近花了很多时间来完善文章,不仅加入了Redis新版本的...

关键字: 数据结构 REDIS 节点 字符串

大家好,我是小林。Redis为什么那么快?除了它是内存数据库,使得所有的操作都在内存上进行之外,还有一个重要因素,它实现的数据结构,使得我们对数据进行增删查改操作时,Redis能高效的处理。因此,这次我们就来好好聊一下R...

关键字: 数据结构 REDIS

Redis为什么那么快?除了它是内存数据库,使得所有的操作都在内存上进行之外,还有一个重要因素,它实现的数据结构,使得我们对数据进行增删查改操作时,Redis能高效的处理。因此,这次我们就来好好聊一下Redis数据结构,...

关键字: 数据结构

前几天,小灰给大家介绍了什么是算法。说到算法,就不能不说起数据结构。今天我来讲一讲,什么是数据结构?程序员怎么学好数据结构?我们介绍算法的时候说过,计算机当中的算法,本质就是一系列程序指令,用以解决特定的运算和逻辑问题。...

关键字: 数据结构
关闭
关闭