-
题目描述:
-
给你一串路径,譬如:
a\b\c
a\d\e
b\cst
d\
你把这些路径中蕴含的目录结构给画出来,子目录直接列在父目录下面,并比父目录向右缩一格,就像这样:
a
b
c
d
e
b
cst
d
同一级的需要按字母顺序排列,不能乱。
-
输入:
-
每个测试案例第一行为一个正整数n(n<=10)表示有n个路径,当n为0时,测试结束,接下来有n行,每行有一个字串表示一个路径,长度小于50。
-
输出:
-
输出目录结构,每一个测试样例的输出紧跟一个空行。
-
样例输入:
-
4 a\b\c a\d\e b\cst d\ 0
-
样例输出:
-
a b c d e b cst d
-
这里采用枚举字符串的前缀,存到vector里,按照字典序进行排序,剩下的就是按照规则打印输出了。
-
#include <iostream> #include <string> #include <cstdio> #include <vector> #include <algorithm> using namespace std; vector<string> v; bool mycmp(string s1,string s2) { int len=s1.size()>s2.size()?s2.size():s1.size(); for(int i=0;i<len;i++) { if(s1[i]!=s2[i]) { if(s1[i]!='\\'&&s2[i]!='\\') { return s1[i]<s2[i]; } else if(s1[i]=='\\') { return true; } else if(s2[i]=='\\') { return false; } } } return s1.size()<s2.size(); } int main() { int n; string s; while(scanf("%d",&n)==1&&n!=0) { v.resize(0); while(n--) { cin>>s; if(s[s.size()-1]=='\\') { s.erase(s.size()-1,s.size()); } if(find(v.begin(),v.end(),s)==v.end()) { v.push_back(s); } while(s.find('\\')!=string::npos) { s.erase(s.find_last_of('\\'),s.size()); if(find(v.begin(),v.end(),s)==v.end()) { v.push_back(s); } } } sort(v.begin(),v.end(),mycmp); for(unsigned int i=0;i<v.size();i++) { if(v[i].find('\\')==string::npos) { cout<<v[i]<<endl; } else { for(unsigned int j=0;j<v[i].find_last_of('\\');j++) { cout<<" "; } cout<<" "; cout<<v[i].substr(v[i].find_last_of('\\')+1,v[i].size())<<endl; } } cout<<endl; } return 0; }