洛谷__P1738 洛谷的文件夹
题目描述
kkksc03 是个非凡的空想家!在短时间内他设想了大量网页,然后总是交给可怜的 lzn 去实现。
洛谷的网页端,有很多文件夹,文件夹还套着文件夹。
例如:/luogu/application/controller 表示根目录下有一个名称为 luogu 的文件夹,这个文件夹下有一个名称 application 的文件夹,其中还有名为 controller 的文件夹。
每个路径的第 1 个字符总是 /,且没有两个连续的 /,最后的字符不是 /。所有名称仅包含数字和小写字母。
目前根目录是空的。kkksc03 想好了很多应该有的文件夹路径名。问题是,需要是使这些文件夹都存在,需要新建几个文件夹呢?
输入格式
输入文件第 1 行为一个正整数 N。
接下来 N 行,每行为一个描述路径的字符串,长度均不超过 100。
输出格式
输出应包含 N 行,每行 1 个正整数,第 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
思路:
不必把每个单词看成单独的一个块,
只需要检查每个 ' / ' 前是否形成新的块
用set来存,输出时要把最开头的 ' / ' 去掉,即 -1;
代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<vector>
#include<queue>
#include<deque>
#include<stack>
#include<set>
#include<map>
#include<unordered_set>
#include<unordered_map>
#include<bitset>
#include<tuple>
#define inf 72340172838076673
#define int long long
#define endl '\n'
#define F first
#define S second
#define mst(a,x) memset(a,x,sizeof (a))
using namespace std;
typedef pair<int, int> pii;
const int N = 200086, mod = 998244353;
int n;
string s;
set<string> st;
int res = 0;
void solve() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> s;
string t = "";
for (int j = 0; j < s.size(); j++) {
if (s[j] == '/') st.insert(t);
t += s[j];
}
st.insert(t);
cout << st.size() - 1 << endl;
}
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
int T = 1;
// cin >> T;
while (T--) solve();
return 0;
}
题目链接:P1738 洛谷的文件夹 - 洛谷

浙公网安备 33010602011771号