http://acm.pku.edu.cn/JudgeOnline/problem?id=1057

Код:
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
string s;
struct Directory
{
	string name;
	vector<Directory> menu;
	vector<string> files;
};
void build(Directory& t, string s)
{
	if(s == "*" || s == "]")
return;
	if(s[0] == 'f')
	{
t.files.push_back(s);
cin >> s;
build(t, s);
	}
	else
	{
Directory d;
d.name = s;
cin >> s;
build(d, s);
t.menu.push_back(d);

cin >> s;	 
build(t, s);
	}
}
void printLayer(int layer)
{
	for(int i = 0; i < layer; ++i)
cout << "|     ";
}
void print(Directory& t, int layer)
{
	printLayer(layer);
	cout << t.name << endl;
	for(unsigned int i = 0; i < t.menu.size(); ++i)
print(t.menu[i], layer+1);
	sort(t.files.begin(), t.files.end());
	for(unsigned int i = 0; i < t.files.size(); ++i)
	{
printLayer(layer);
cout << t.files[i] << endl;
	}
}
int main()
{
	string s;
	int cnt = 0;
	while(1)
	{
cin >> s;
if(s == "#")
	break;
Directory d;
d.name = "ROOT";
printf("DATA SET %d:\n", ++cnt);
build(d, s);
print(d, 0);
cout << endl;
	}
	return 0;
}