【2019csp模拟】文件列表
[2019csp模拟] 文件列表
题目描述
生成像 cmd 里 "tree" 指令一样的树,要求如下:
生成的列表格式有如下要求:
1.属于同一层的文件或文件夹位于相同的缩进处,相邻两层文件间差距 5 个字
符;
2.每个文件夹或文件前有 4 个'-'(根目录除外),文件夹下方属于文件夹的部分有
'|';
3.属于统一文件夹下的文件或子文件夹按字典序排列;
如图:
\(\mathbb{Solution:}\)
就是一个暴力题,直接按题意做即可,可以对于文件夹递归解决。
最好是存 vector + map,可以简便地字典序排序。
\(\mathbf{Code:}\)
#include <bits/stdc++.h>
#define mp(x, y) make_pair(x, y)
const int N = 51;
using namespace std;
int n;
string s;
inline char readc() { char c = getchar(); for (; (c < 'a' || c > 'z') && c != '/'; c = getchar()); return c; }
std::map<pair<string, string>, std::vector<string> > F;
inline void Print(string u, string la, string sig) {
for (int i = 0; i < (int)F[mp(u, sig)].size(); ++i) {
string v = F[mp(u, sig)][i];
cout << (u == "" ? "" : la + "----") << v << endl;
Print(v, la + (u == "" ? "" : " |"), sig + v);
}
}
int main(void) {
freopen("file.in", "r", stdin), freopen("file.out", "w", stdout);
scanf("%d", &n), F.clear(), F[mp("", "")].clear();
for (int i = 1; i <= n; ++i) {
cin >> s; string la = "", t = "", sign = "", sl = "";
for (int j = 0; j < (int)s.size(); ++j)
if (s[j] != '/') t += s[j], sign += s[j];
else {
if (F.count(mp(t, sign))) { la = t, sl = sign, t = ""; continue; }
F[mp(la, sl)].push_back(t), F[mp(t, sign)].clear(), la = t, sl = sign, t = "";
}
if (F.count(mp(t, sign))) { la = t, sl = sign, t = ""; continue; }
F[mp(la, sl)].push_back(t), F[mp(t, sign)].clear(), la = t, t = "";
}
map<pair<string, string>, std::vector<string> >::iterator it;
for (it = F.begin(); it != F.end(); ++it) { sort((*it).second.begin(), (*it).second.end()); }
Print("", "|", "");
return 0;
}