刘珈汝不要生气了!我错了

没有优化的情况,运行时间和空间比较大,但是代码应该是比较清楚易懂。
图片说明


首先先要理解题意:
1.只有前边几个元素都相同的情况下才要折叠起来。
例如:
a\b\c
b\c
这个应该写成下边第一个,而不是第二个的形式

2.要按照字母顺序进行排列,这一点只要sort排序就好了。
理解了题意就可以想象这道题的解决方案:
1.先对所有的输入按照字母顺序进行排序(直接sort就可以)。
2.把形如“a\b\c”的字符串分割成[“a”,“b”,“c”]这样的字符串数组。
3.第一组直接输出就可以,后边的每一组要分别找到距离前一组的第一个不同元素。这儿不太好理解,我们举个例子:
图片说明
所以通过以上三个顺序进行求解就可以了。

#include<iostream>
#include<string> 
#include<algorithm>
using namespace std;
const int maxn=11;
vector<string> vec[maxn];
int n;string s;
int main(){
    while(cin>>n&&n!=0){
        for(int i=0;i<n;i++){
            cin>>s;
            vec[i].clear();//清楚上一次的 
            vec[i].push_back(s);
        }sort(vec,vec+n);
        for(int i=0;i<n;i++){//截取 把形如“a\b\c”的字符串分割成[“a”,“b”,“c”]这样的字符串数组
            s=vec[i][0];
            vec[i].clear();
            int j=0,index;
            while(j<s.size()){
                if((index=s.find('\\',j))!=string::npos){
                    vec[i].push_back(s.substr(j,index-j));//substr截取函数(从j位开始,截取index-j位) 
                    j=index+1;
                }else{
                    vec[i].push_back(s.substr(j,s.size()-j));break;
                }
            }    
        }for(int i=0;i<n;i++){//打印 
            if(i==0){//第一个直接输出 
                for(int j=0;j<vec[i].size();j++){
                    for(int k=0;k<j;k++)cout<<"  ";
                    cout<<vec[i][j]<<endl; 
                }
            }else{//找到和前一个第一个不相等的位置 
                int j=0;
                while(j<vec[i-1].size()&&j<vec[i].size()&&vec[i][j]==vec[i-1][j])j++;
                if(j==0){//如果第一个字母就不相同,直接输出 
                    for(int k=0;k<vec[i].size();k++){
                        for(int l=0;l<k;l++)cout<<"  ";
                        cout<<vec[i][k]<<endl; 
                    }
                }else{//找到了第一个不相同的位置j,从j开始输出 
                    for(int k=j;k<vec[i].size();k++){
                        for(int l=0;l<k;l++)cout<<"  ";
                        cout<<vec[i][k]<<endl;
                    }
                } 
            }
        }cout<<endl;
    }
    return 0;
}