题目链接:点击打开链接
题目大意:略。
解题思路:略。
AC 代码
#include<bits/stdc++.h>
#include<cmath>
#define mem(a,b) memset(a,b,sizeof a);
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn=500;
struct node
{
string name;
int pri;
vector<node> vec;
node(){}
node(string name,int pri):name(name),pri(pri){}
}rt;
int cmp(node n1,node n2)
{
if(n1.pri==n2.pri) return n1.name<n2.name;
return n1.pri>n2.pri;
}
string a[maxn];
int pris[maxn];
void add(node &nd,int pos,int cnt)
{
if(cnt==pos) return;
int i;
for(i=0;i<nd.vec.size();i++)
{
if(a[pos]==nd.vec[i].name)
{
add(nd.vec[i],pos+1,cnt);
return ;
}
}
node tnd(a[pos],pris[pos]);
nd.vec.push_back(tnd);
add(nd.vec[i],pos+1,cnt);
}
void dfs(node nd,int cnt)
{
for(int i=0;i<cnt;i++) printf(" ");
printf("%s\n",nd.name.c_str());
sort(nd.vec.begin(),nd.vec.end(),cmp);
for(int i=0;i<nd.vec.size();i++) dfs(nd.vec[i],cnt+1);
}
int main()
{
int n, cur;
string s,ts;
stringstream ss;
while(~scanf("%d",&n))
{
cin.get();
rt.name="root";
rt.pri=1; // 是目录
rt.vec.clear();
for(int i=0;i<n;i++)
{
getline(cin,s);
int flag=s[s.length()-1]=='\\'?1:0; // 判断最后是否为目录
for(int j=0;j<s.length();j++)
if(!isalpha(s[j])) s[j]=' ';
ss.clear(); ss.str(""); ss<<s;
cur=0;
while(ss>>ts)
{
a[cur]=ts;
pris[cur++]=1; // 标记为目录
}
if(!flag) pris[cur-1]=0;
add(rt,0,cur);
}
dfs(rt,0);
}
return 0;
}