网站大量收购闲置独家精品文档,联系QQ:2885784924

141、小蓝的神秘图书馆.docx

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

解题思路

思路/明确目标

本题需要我们实现一个字符串前缀匹配的功能,即对于每个询问?T,需要找到图书馆中有多少本书的名字以?T?开头。

解题步骤

首先,我们需要对图书馆中的所有书籍建立一个Trie树。Trie树是一种字典树,它能够对一组字符串进行快速的检索、插入和删除操作。Trie树的基本思想是利用字符串之间的公共前缀,将重复的前缀合并在一起,从而减少存储空间,并且能够快速地进行字符串匹配操作。在Trie树中,每个节点代表一个字符串的前缀,从根节点到叶子节点的路径表示一条完整的字符串,而在每个节点上,我们可以记录一些额外的信息,例如该节点代表的字符串出现的次数等。

接下来,对于每个询问?T,我们可以在Trie树上进行搜索,寻找以?T?为前缀的所有字符串。具体地,我们从Trie树的根节点开始,依次遍历?T?中的每个字符,从当前节点的所有儿子中选择一个字符与之匹配,然后进入该儿子节点。如果?T?中的所有字符都被匹配完了,那么我们就到达了一个叶子节点,此时该节点代表的字符串就是以?T?开头的一个字符串。我们可以在到达叶子节点的同时,统计一下该节点代表的字符串出现的次数,然后将这个次数累加到答案中。如果在?T?的某个字符处,我们发现当前节点没有与之匹配的儿子节点,那么说明图书馆中没有以T?开头的字符串,直接返回当前的答案即可。

最后,对于每个询问,我们输出它对应的答案即可。

具体实现

基于以上分析,我们可以得出以下详细的解题步骤:

初始化Trie

我们需要一个二维数组?son[][]?来存储Trie的节点关系,以及一个一维数组cnt[]?来记录每个节点的字符串数量。这个Trie的特点是,对于一个节点?q,它的子节点?son[q][u]?是一个字符u,数组?cnt[q]?存储了以节点q?为终点的所有字符串的数量。

插入字符串

对于每一本书的名字,我们将其插入Trie。对于字符串中的每一个字符?u,我们在Trie中添加一个对应的节点。同时,每当一个字符串到达终点时,我们将对应节点的cnt[]?值加一,表示有一个新的字符串以此为终点。

查询字符串

对于每一个询问,我们在Trie中查找对应的字符串。我们从Trie的根节点开始,对于询问字符串中的每一个字符?u,我们都尝试转移到对应的子节点。如果在某一步中,对应的子节点不存在,那么我们可以立即返回?0,表示没有任何字符串以给定的字符串为前缀。否则,我们将所有经过的节点的?cnt[]?值累加起来,得到的就是以给定字符串为前缀的字符串的数量。

AC_Code

C++

#includebits/stdc++.h

usingnamespacestd;

constintN=2e5+10;

intn,q,cnt[N*27],son[N][27],TOT=0;

voidinsert(stringS)

{

intq=0;

for(inti=0;iS.size();i++)

{

intu=S[i]-a;

if(son[q][u]==0)

son[q][u]=++TOT;

q=son[q][u];

cnt[q]++;

}

}

intquery(stringS)

{

intq=0,ans=0;

for(inti=0;iS.size();i++)

{

intu=S[i]-a;

q=son[q][u];

if(q==0)

returnans;

}

returncnt[q];

}

signedmain()

{

cinnq;

strings;

for(inti=1;i=n;i++)

cins,insert(s);

for(inti=1;i=q;i++)

cins,coutquery(s)\n;

return0;

}

Java

importjava.io.*;

importjava.util.*;

publicclassMain{

staticfinalintN=(int)1e6+10;

staticint[][]son=newint[N][26];

staticint[]cnt=newint[N];

s

文档评论(0)

如此醉 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档