Luogu1738 | 洛谷的文件夹 (Trie+STL)
题目描述
kkksc03是个非凡的空想家!在短时间内他设想了大量网页,然后总是交给可怜的lzn去实现。
洛谷的网页端,有很多文件夹,文件夹还套着文件夹。
例如:\(/luogu/application/controller\) 表示根目录下有一个名称为 \(luogu\) 的文件夹,这个文件夹下有一个名称 \(application\) 的文件夹,其中还有名为 \(controller\) 的文件夹。
每个路径的第1个字符总是 \(/\) ,且没有两个连续的 \(/\) ,最后的字符不是 \(/\) 。所有名称仅包含数字和小写字母。
目前根目录是空的。kkksc03想好了很多应该有的文件夹路径名。问题是,需要是使这些文件夹都存在,需要新建几个文件夹呢?
输入格式
输入文件第1行为一个正整数 \(N\) 。
接下来N行,每行为一个描述路径的字符串,长度均不超过 \(100\) 。
输出格式
输出应包含N行,每行一个正整数,第i行输出若要使第 \(1\) 个路径到第 \(i\) 个路径存在,最少需要新建多少个文件夹。
输入输出样例
输入 #1
2
/luogu/application/controller
/luogu/application/view
输出 #1
3
4
输入 #2
3
/chicken
/chicken/egg
/chicken
输出 #2
1
2
2
输入 #3
4
/a
/a/b
/a/c
/b/b
输出 #3
1
2
3
5
说明/提示
数据规模:
对于所有数据,\(N<=1000\) 。
对于 \(20\%\) 数据,有 \(N<=20\) ;
对于 \(50\%\) 数据,有 \(N<=200\) ;
对于 \(30\%\) 数据,有对于所有路径最多存在两个 \(/\)(包含第 \(1\) 个字符)。
————————————————————————————————
有两种比较显然的做法,第一种是直接用 \(set\) 容器存储每个文件夹的绝对路径,然后每次按顺序判断是否需要新建。
第二种是用 \(Trie\) 的结构来实现,并且这棵字典树只需要支持插入和计数操作,所以代码非常短。
理论上来讲后者的时空复杂度都是优于前者的,但是由于数据比较小,经测试实际前者更优。
这里给出第二种做法,使用了 \(map\) 容器把字符串映射为树节点的编号,方便插入和判重处理。
代码如下:
#include <bits/stdc++.h>
#define MAXN 100007
using namespace std;
int n,cnt;
map<string,int> G[MAXN];
void Find(int &now,string ob) {
//当前在编号为 now 的目录下查找名为 ob 的文件夹
if (!G[now].count(ob)) G[now][ob]=++cnt;
now=G[now][ob];
}
int main() {
scanf("%d",&n);
for (int i=1;i<=n;i++) {
string s; cin>>s,s+='/'; //方便后面的代码处理,字符串尾部加个'/'
int len=(int)s.size(),now=0,pt=1;
for (int i=1;i<=len;i++)
if (s[i]=='/') Find(now,s.substr(pt,i-pt)),pt=i+1;
printf("%d\n",cnt); //cnt 为当前已经创建的文件夹数量
}
return 0;
}
Luogu1738 | 洛谷的文件夹 (Trie+STL)的更多相关文章
- Java实现 洛谷 P1738 洛谷的文件夹
题目描述 kkksc03是个非凡的空想家!在短时间内他设想了大量网页,然后总是交给可怜的lzn去实现. 洛谷的网页端,有很多文件夹,文件夹还套着文件夹. 例如:/luogu/application/c ...
- 2021.08.05 P1738 洛谷的文件夹(树形结构)
2021.08.05 P1738 洛谷的文件夹(树形结构) P1738 洛谷的文件夹 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.树!! 题意: 给出n个网页路径,求 ...
- 洛谷P1738 洛谷的文件夹
原题目:点我 题目是一个略水的题,我机制地用面向对象做了...所以代码量急剧加大,100行233 模拟即可,字符串处理麻烦点.如果没有找到子文件夹就新建文件夹,如果有就进入该文件夹. 提示:高能,指针 ...
- Luogu P1738 洛谷的文件夹
P1738 Luogu 发一个链表题解! 仅有24ms,排名第一哦~ 圆圈代表点,每个店有两个指针,一个指向自己兄弟(同级文件夹),另一个指向自己孩子(子文件夹),还有一个保存当前名字. 有点像二叉树 ...
- 洛谷 P1706 全排列问题 :STL / dfs
题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入输出格式 输入格式: n(1≤n≤9) 输出格式: 由1-n组成的所有不重复的数字序列, ...
- 洛谷P2412 查单词 [trie树 RMQ]
题目背景 滚粗了的HansBug在收拾旧英语书,然而他发现了什么奇妙的东西. 题目描述 udp2.T3如果遇到相同的字符串,输出后面的 蒟蒻HansBug在一本英语书里面找到了一个单词表,包含N个单词 ...
- 洛谷.3065.第一!First!(Trie 拓扑)
题目链接 \(Description\) 给出n个字符串,问重定义英文字符的顺序(即字典序),有哪些单词可能排在第一 \(Solution\) 一个单词想要排在第一,首先是没有其它字符串是它的前缀.那 ...
- 洛谷P1124 文件压缩
https://www.luogu.org/problem/show?pid=1124 题目背景 提高文件的压缩率一直是人们追求的目标.近几年有人提出了这样一种算法,它虽然只是单纯地对文件进行重排,本 ...
- 洛谷 P1124 文件压缩
P1124 文件压缩 题目背景 提高文件的压缩率一直是人们追求的目标.近几年有人提出了这样一种算法,它虽然只是单纯地对文件进行重排,本身并不压缩文件,但是经这种算法调整后的文件在大多数情况下都能获得比 ...
随机推荐
- java设计模式2————工厂模式
1.工厂模式介绍: 1.1.实现了创建者与调用者的分离 1.2.详细分类: 简单工厂模式 工厂方法模式 抽象工厂模式 1.3.所遵循的OOP原则: 开闭原则:对扩展开放,对修改关闭 依赖倒转原则:面向 ...
- Github第三方登陆详细流程
一. 流程图 二.具体实现步骤 Ⅰ.创建OAuth App 我们首先需要创建一个OAuth App,根据下图的步骤点击即可 依次填写信息,然后点Register application 然后我们可以看 ...
- sqlserver check running process 1
check process script 1, check which is current running: use master SELECTspid,ER.percent_complete,CA ...
- 高精度模板(Vector实现更加方便)
计算的数long long 甚至更大的数据类型的都存不下的时候,应该怎么办 ? 解决方法 :我们可以把一个很大的数当做字符串进行处理,这时候就需要用到高精度. 话不多说,咱们边看代码边处理 : 加法 ...
- 【LaTeX】记录一下LaTeX的安装和使用
由于排版论文的需要,了解了一些LaTeX的相关内容,下面简单记录关于LaTeX的安装和使用 维基百科: LaTeX(/ˈlɑːtɛx/,常被读作/ˈlɑːtɛk/或/ˈleɪtɛk/),文字形式写作L ...
- Import This - The Zen of Python
The Zen of Python -- by Tim Peters Beautiful is better than ugly.Explicit is better than implicit.Si ...
- Android 6.0(棉花糖)新特性
1.支持4K显示 Android 6.0本身已经支持4K显示,会通过一定优化形式使4K内容更加清晰. 2. 启动验证 (更完整的应用权限管理) Android 6.0在开机时会自动运行验证代码,检测设 ...
- 线段树学习----C语言
/* 线段树学习:如果一个节点为i,那么他的左孩子为2I+1,右孩子为2i+2: */ #include<stdio.h> #define min(a,b) a<b?a:b; ]; ...
- Windwos日志分析
Windows日志分析工具 查看系统日志方法: 在“开始”菜单上,依次指向“所有程序”.“管理工具”,然后单击“事件查看器” 按 "Window+R",输入 ”eventvwr.m ...
- 制作OpenOffice的Docker镜像并添加中文字体解决乱码问题
官网下载openoffice http://www.openoffice.org/download/index.html 本文使用的是Docker官方发布的CentOS7镜像作为基础镜像.镜像的获取方 ...