http://codeforces.com/gym/101620/attachments
给你n个字符串(n<=1000,长度<=100)
/……/ 中间是目录,最后一个是文件,给了你每个文件的路径和大小,让你打印出目录
根目录一定要打,要展开用“-”,不展开用“+”,没有子目录了是“ ”
给了你一个限制条件x
只有子目录大小>=x,才需要打印,还需要按照字典序排列
很恶心的大模拟
#include <bits/stdc++.h>
using namespace std;
map <string, int> m1; //m1,m2互相对应
map <int, string> m2;
vector <int> vec[50005]; //储存祖孙关系,为了得到Size
set <string> s[50005]; //储存同一目录下的所有,用set解决字典序大小问题
int Size[50005]; //得到每个目录极其目录下所有文件的大小
string a;
int limit;
bool vis[50005]; //判断是否是结尾文件
void Solve(int x)
{
if(vis[x]) return;
int n = vec[x].size();
int ans = 0;
int flag = 0;
for(int i = 0; i < n; i++)
{
int y = vec[x][i];
if(!vis[y])
{
ans = max(ans, Size[y]);
flag = 1;
}
}
if(flag == 0)
{
cout<<" "<<m2[x]<<" "<<Size[x]<<endl;
return;
}
if(ans >= limit)
{
cout<<"- "<<m2[x]<<" "<<Size[x]<<endl;
int z = s[x].size();
for (set<string>::iterator it = s[x].begin(); it != s[x].end(); ++it)
{
string p = *it;
Solve(m1[p]);
}
return;
}
else
{
cout<<"+ "<<m2[x]<<" "<<Size[x]<<endl;
return;
}
}
void dfs(int x)
{
int n = vec[x].size();
for(int i = 0; i < n; i++)
{
int y = vec[x][i];
dfs(y);
Size[x] += Size[y];
}
}
int main()
{
int n, tot = 0;
scanf("%d", &n);
for(int i = 1; i <= n; i++)
{
int baga;
cin >> a >> baga;
string pre = a;
int l = a.length();
m1[a] = ++tot, m2[tot] = a, vis[tot] = 1, Size[tot] = baga;
for(int i = l - 1; i >= 0; i--)
{
if(a[i] == '/')
{
string b = a.substr(0, i + 1);
if(!m1.count(b)) // 没有出现过
{
m1[b] = ++tot, m2[tot] = b;
vec[tot].push_back(tot - 1);
s[tot].insert(pre);
pre = b;
}
else
{
vec[m1[b]].push_back(tot);
s[m1[b]].insert(pre);
break;
}
}
}
}
cin>>limit;
dfs(m1["/"]);
Solve(m1["/"]);
return 0;
}