题目描述
kkksc03 是个非凡的空想家!在短时间内他设想了大量网页,然后总是交给可怜的 lzn 去实现。
洛谷的网页端,有很多文件夹,文件夹还套着文件夹。
例如:/luogu/application/controller/ 表示根目录下有一个名称为 luogu 的文件夹,这个文件夹下有一个名称 application的文件夹,其中还有名为 controller的文件夹。
每个路径的第 1 个字符总是/,且没有两个连续的 /,最后的字符不是 /。所有名称仅包含数字和小写字母。
目前根目录是空的。kkksc03 想好了很多应该有的文件夹路径名。问题是,需要是使这些文件夹都存在,需要新建几个文件夹呢?
输入格式
输入文件第 1 行为一个正整数 N。
接下来 N 行,每行为一个描述路径的字符串,长度均不超过 100。
输出格式
输出应包含 N 行,每行 1 个正整数,第i 行输出若要使第 1 个路径到第 ii 个路径存在,最少需要新建多少个文件夹。
输入输出样例
输入 #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
说明/提示
数据范围及约定
- 对于 20%数据,有 N≤20;
- 对于 50% 数据,有 N≤200;
- 另有 30% 数据,有对于所有路径最多存在两个 /(包含第 1 个字符);
- 对于所有数据,N≤1000。
解题思路(小tips)
本题非常简单 只要读懂题意:对每一种路径下的每一个文件夹都计数一次 重复则忽略不计
这里可以使用cppSTL中的set结构:因为其可以自动去重 所以在这里可以不考虑是否重复 直接插入即可 出现重复会自动忽略 另外对每行结尾 因为无‘/了 特判一次就行
甚至最后直接使用其自带的size函数 连计数器都不用额外添加了
如果仍有疑问 可以直接在评论区打字交流
AC代码展示
如果觉得有用 就点赞+收藏 鼓励一下吧
#include <iostream>
#include <set>
using namespace std;
set<string> st;
int n,k;string str,s="";
int res;
int main(){
cin>>n;
while(n--){
cin>>str;
for(int i=1;i<str.size();i++){
if(str[i]=='/') {
st.insert(s);
k=0;
}
s[k++]=str[i];
}
st.insert(s); //处理每行结尾
k=0; //重置
cout<<st.size()<<endl;
//for(auto &it:st) cout<<it<<" ";
}
return 0;
}