--- 这里是 cjiaw 的小窝(●'◡'●) ---

正在玩命加载中......

洛谷__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 洛谷的文件夹 - 洛谷

 

posted @ 2025-10-05 15:55  wwjjw  阅读(20)  评论(0)    收藏  举报