北京赛区(2016)网络赛 A题 The Book List

char ch[105];
typedef struct node* Node;
struct node{
	string name;
	vector<Node> nxt;
	vector<Node> child;
};
Node newnode(){
	Node a = (Node)new node;
	return a;
}
vector<string> save;
void build(Node rt, int tail){
	int lev = 0, i;
	Node last = rt;
	while (lev < tail - 1){
		for (i = 0; i < last->nxt.size(); i++)
		if (last->nxt[i]->name == save[lev]){
			break;
		}
		if (i < last->nxt.size()){
			last = last->nxt[i];
		}
		else{
			Node now = newnode();
			now->name = save[lev];
			last->nxt.push_back(now);
			last = now;
		}
		lev++;
	}
	if (lev == tail - 1){
		for (int i = 0; i < last->child.size(); i++)
		if (last->child[i]->name == save[lev])
			return;
		Node now = newnode();
		now->name = save[lev];
		last->child.push_back(now);
	}
}
bool cmp(Node a, Node b){
	return a->name<b->name;
}
void visit(Node root,int lev){
	if (lev > 0){
		for (int i = 0; i < 4 * (lev - 1); i++)
			putchar(' ');
		cout << root->name << endl;
	}
	sort(root->nxt.begin(), root->nxt.end(), cmp);
	sort(root->child.begin(), root->child.end(), cmp);
	for (int i = 0; i < root->nxt.size(); i++)
		visit(root->nxt[i], lev + 1);
	for (int i = 0; i < root->child.size(); i++)
		visit(root->child[i], lev + 1);
}
void free(Node root, int lev){
	for (int i = 0; i < root->child.size(); i++)
		free(root->child[i], lev + 1);
	for (int i = 0; i < root->nxt.size(); i++)
		free(root->nxt[i], lev + 1);
	delete(root);
}
void data_in(){

}
void solve(){

}
int main(){
	int cas = 0;

	while (gets(ch)){
		Node root = newnode();
		while (strcmp(ch, "0") != 0){
			int len = strlen(ch), pos = 0;
			save.clear();
			while (pos<len){
				while (ch[pos] == '/')
					pos++;
				string str = "";
				while (ch[pos] != '/'&&pos < len)
					str += ch[pos], pos++;
				save.push_back(str);
			}
			build(root, save.size());
			gets(ch);
		}
		printf("Case %d:\n", ++cas);
		visit(root, 0);
		free(root, 0);
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值