1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
| #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; }
|