题目链接:点击打开链接
题目大意:略。
解题思路:略。
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; }