ディスクツリー

タイトル説明

ハッカービルは誤って自分のワークステーションのハードドライブからすべての情報を失ってしまったし、彼はその内容のバックアップコピーを持っていません。彼は、彼は仕事の年の間に作成され、大事にしていた非常に素晴らしく、便利なディレクトリ構造のため、ファイルそのものの損失を後悔していません。幸いなことに、ビルは彼のハードドライブからのディレクトリリストのコピーをいくつか持っています。彼はいくつかのディレクトリのために(「WINNT \ SYSTEM32 \ certsrvなど\ CERTCO〜1 \ X86」のように)完全なパスを回復することができたこれらのリストを使用しました。彼は別の行に発見した各パスを書き込むことにより、ファイルにそれらのすべてを置きます。あなたの仕事はビルがきれいにフォーマットされたディレクトリツリーを提供することにより、当該技術分野のディレクトリ構造の彼の状態を復元するのに役立ちますプログラムを書くことです。

エントリー

入力ファイルの最初の行は、異なるディレクトリ・パスの総数を表す単一の整数N(1 <= N <= 500)を含みます。そして、ディレクトリパスを持つNラインが続きます。各ディレクトリ・パスは、単一の行を占め、ものを先頭または末尾を含む任意の空白を、含まれていません。いいえパスは80文字を超えることはありません。各パスは、一度表示され、バックスラッシュ(「」)で区切られたディレクトリ名の番号で構成されています。

感嘆符、番号記号、ドル記号、パーセント記号、アンパサンド、アポストロフィ、開閉括弧、ハイフン記号、で、商業、曲折:各ディレクトリ名には、以下のリストから1〜8大文字、数字、または特殊文字で構成されていアクセントは、墓のアクセント、開閉中括弧を強調し、チルダ( "#$%& '() - !@ ^ _` {}〜")。

輸出

出力ファイルフォーマットのディレクトリツリーに書き込みます。各ディレクトリ名はディレクトリ階層にその深さを示しているスペースの数が先行する独自の行にリストされなければなりません。サブディレクトリには、すぐにその親ディレクトリよりも1つの多くのスペースが先行し、その親ディレクトリの後に辞書順にリストされなければなりません。トップレベルのディレクトリには、その名前の前に印刷はスペースがあってはならないし、辞書順にリストされなければなりません。出力形式の明確化のために以下のサンプルを参照してください。

サンプル入力

7
WINNT \ SYSTEM32 \ CONFIG
ゲーム
WINNT \ DRIVERSの
HOME
WIN \ SOFT
GAMES \ DRIVERS
WINNT \ SYSTEM32 \ certsrvなど\ CERTCO〜1 \ X86

サンプル出力

GAMES
 DRIVERS
HOME
WIN
 SOFT
WINNT
 DRIVERS
 SYSTEM32
  CERTSRV
   CERTCO~1
    X86
  CONFIG

唯一の学校でハンドオーバ可能コードOJ、POJ手渡しタイムアウトいじり

ファイル名が繰り返されない、正の解は、手動チェーンツリー、バイナリ、マルチターンフォークで開始したい、いじり発注、ベクトルが変化するのが面倒、少し遅いシミュレート時にノードを追加

#include<iostream>
#include<string.h>
#include<stdio.h>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
using namespace std;
int n,cnt,T;
struct E{
    string s;
    int pla;
    vector<int>v;
};
E fir[520];
E node[20020];
int fircnt=0;
int cmp(E x,E y){
    return x.s<y.s;
}
int cmp1(int x,int y){
    return node[x].s<node[y].s;
}
void dfs(int cur,int h){
    if(cur==0) return;
    if(h==0){
        cout<<fir[cur].s<<endl;
        sort(fir[cur].v.begin(),fir[cur].v.end(),cmp1);
        for(int i=0;i<fir[cur].v.size();i++){
            dfs(fir[cur].v[i],h+1);
        }
    }
    else{
        for(int i=1;i<=h;i++) printf(" ");
        cout<<node[cur].s<<endl;
        sort(node[cur].v.begin(),node[cur].v.end(),cmp1);
        for(int i=0;i<node[cur].v.size();i++){
            dfs(node[cur].v[i],h+1);
        }
    }
}
 
int main(){
    //freopen("I.in","r",stdin);
    //freopen("I.out","w",stdout);
    //cin>>T;
    T=1;
    while(T--){
        //for(int i=1;i<=cnt;i++) a[i].clear();
        cnt=fircnt=0;
        //memset(e,0,sizeof(e));
        //memset(root,0,sizeof(root));
        //mp.clear();
        cin>>n;
        string s0;
        for(int i=1;i<=n;i++){
            cin>>s0;
            int x1=-1,x2=-1;
            string tmps="";//,last="";
            int last=0,tmp,cur=0;
            for(int j=0;j<s0.size();j++){
                if(x2==-1&&s0[j]=='\\'){
                    cur++;
                    x2=j;
                    tmps=s0.substr(0,j);
                    tmp=-1;
                    for(int k=1;k<=fircnt;k++){
                        if(tmps==fir[k].s){
                            tmp=k;
                            break;
                        }
                    }
                    if(tmp==-1){
                        ++fircnt;
                        fir[fircnt]=(E){tmps,fircnt};
                        last=fircnt;
                    }
                    else{
                        last=fir[tmp].pla;
                    }
                    //cout<<tmps<<' ';
                }
                else if(s0[j]=='\\'){
                    cur++;
                    x1=x2,x2=j;
                    tmps=s0.substr(x1+1,x2-x1-1);
                    tmp=-1;
                    //if(tmps=="SYSTEM32")cout<<"!!!";
                    if(cur==2){
                         
                        for(int k=0;k<fir[last].v.size();k++){
                            if(tmps==node[fir[last].v[k]].s){
                                tmp=k;
                                break;
                            }
                        }
                        if(tmp==-1){
                            ++cnt;
                            node[cnt]=(E){tmps,cnt};
                            fir[last].v.push_back(cnt);
                            last=cnt;
                        }
                        else{
                            last=node[fir[last].v[tmp]].pla;
                        }
                        /*if(tmps=="SYSTEM32"){
                            cout<<"^^"<<tmp;
                            cout<<"&&"<<last<<"&&"<<endl;
                        }*/
                    }
                    else{
                        /*if(tmps=="CERTSRV"){
                            cout<<"&&"<<last<<"&&"<<endl;
                        }*/
                        for(int k=0;k<node[last].v.size();k++){
                            if(tmps==node[node[last].v[k]].s){
                                tmp=k;
                                break;
                            }
                        }
                         
                        if(tmp==-1){
                            ++cnt;
                            node[cnt]=(E){tmps,cnt};
                            node[last].v.push_back(cnt);
                            last=cnt;
                        }
                        else{
                            last=node[node[last].v[tmp]].pla;
                        }
                    }
                    //cout<<tmps<<' ';
                }
            }
            if(x1==-1&&x2==-1){
                cur++;
                tmps=s0.substr(0,s0.size());
                tmp=-1;
                for(int k=1;k<=fircnt;k++){
                    if(tmps==fir[k].s){
                        tmp=k;
                        break;
                    }
                }
                if(tmp==-1){
                    ++fircnt;
                    fir[fircnt]=(E){tmps,fircnt};
                    last=fircnt;
                }
                else{
                    last=fir[tmp].pla;
                }
                //cout<<tmps<<' ';
            }
            else if(s0[s0.size()-1]!='\\'){
                cur++;
                tmps=s0.substr(x2+1,s0.size()-x2-1);
                tmp=-1;
                if(cur==2){
                    for(int k=0;k<fir[last].v.size();k++){
                        if(tmps==node[fir[last].v[k]].s){
                            tmp=k;
                            break;
                        }
                    }
                    if(tmp==-1){
                        ++cnt;
                        node[cnt]=(E){tmps,cnt};
                        fir[last].v.push_back(cnt);
                        last=cnt;
                    }
                    else{
                        last=node[fir[last].v[tmp]].pla;
                    }
                }
                else{
                    for(int k=0;k<node[last].v.size();k++){
                        if(tmps==node[node[last].v[k]].s){
                            tmp=k;
                            break;
                        }
                    }
                    if(tmp==-1){
                        ++cnt;
                        node[cnt]=(E){tmps,cnt};
                        node[last].v.push_back(cnt);
                        last=cnt;
                    }
                    else{
                        last=node[node[last].v[tmp]].pla;
                    }
                }
                //cout<<tmps<<' ';
            }
            //cout<<endl;
        }
         
        sort(fir+1,fir+1+fircnt,cmp);
        /*printf("*****测试*****\n");
        for(int i=1;i<=cnt;i++){
            cout<<e[i].s<<":";
            for(int j=0;j<a[i][0];j++){
                cout<<e[a[i][j]].s<<' ';
            }
            cout<<endl;
        }
        dfstest(trieroot);
        printf("*****测试*****\n");*/
        for(int i=1;i<=fircnt;i++){
            dfs(i,0);
        }
        /*cout<<"**********"<<endl;
        for(int i=1;i<=fircnt;i++){
            cout<<fir[i].s<<endl;
        }
        cout<<"************"<<endl;
        for(int i=1;i<=cnt;i++){
            cout<<node[i].s<<endl;
        }*/
        if(T) printf("\n");
    }
     
    return 0;
}

おすすめ

転載: www.cnblogs.com/sz-wcc/p/11071961.html