#include<bits/stdc++.h>
using namespace std;/*** command:* cd [dirname]* to shift to a name_given dir* mkdir [dirname]* create a new dir under current dir* ls [dirname]* list the dir under current dir in specific order* * */int dircnt=1; //the number of dir
int now=1; //the dir's ID which you are now
int fa[100010]; //fa for Union-Find
map<string,int>mp; //give it a name turned out a ID
struct direction{string dirname; //its nameint dep; //the dep in the dir_treevector<int>son; //its son_dir
}a[100010]; //struct for directionsdeque<int>pos; // your current path
int pos_size=1; // the size of pathvoid mkdir(){//"mkdir"string new_name;cin>>new_name;if(mp[new_name]){//SPJ for [under]cout<<"already have this direction!"<<endl;return;}dircnt++;mp[new_name]=dircnt; //IDfa[ dircnt ] = now; //son and fathera[now].son.push_back(dircnt); //contain IDa[dircnt].dep=a[now].dep+1; //depa[dircnt].dirname=new_name; //dir_namecout<<"Successfully make a dir named\""<<new_name<<"\""<<endl<<endl;
}int find_dep(int x,int to_dep){if(a[x].dep==to_dep)return x;return find_dep(fa[x],to_dep);
}void change_dir(){//"cd"string to_name;cin>>to_name;if(mp[to_name]==0){//SPJ for [under] invalid casecout<<"you don't have such a direction ,which named \""<<to_name<<"\""<<endl<<endl;return;}int to=mp[to_name],to_dep=a[to].dep;now=to;cout<<"Loading..."<<endl;pos.clear();//as you seepos_size=0;for(int i=1;i<=to_dep;i++){//start from Desktop (time_eff not good(no care))pos.push_back(find_dep(to,i));pos_size++;//dont forget pos_size//cout<<"id:"<<find_dep(to,i)<<" and dir_name:"<<a[find_dep(to,i)].dirname<<endl;//test [up];}cout<<"Successfully changed to \""<<to_name<<"\""<<endl<<endl;
}void list_dir(int now){//"ls"}void init_system(){//as you seefor(int i=0;i<=100009;i++)fa[i]=i; //Union-findmp["Desktop"]=1; //desk_ida[1].dirname="Desktop"; //desk_namea[1].dep=1; //desk_dep now=1; //cur_pospos.push_back(1); //cur_pathcout<<endl; cout<<"<Desktop>:";
}void print_path(){cout<<"<";for(int i=1;i<=pos_size;i++){cout<<a[pos.front()].dirname;pos.push_back(pos.front()); pos.pop_front();if(i!=pos_size)cout<<" / "; //SPJ//using a deque to turn it aside to output//your current path}cout<<">: ";
}int main(){init_system();while(1){string tmp;cin>>tmp;if(isdigit(tmp[0])){cout<<tmp<<endl;print_path();}if(!isdigit(tmp[0])){if(tmp=="mkdir"){mkdir();print_path();continue;}if(tmp=="cd"){change_dir();print_path();continue;}if(tmp=="ls"){list_dir(now);print_path();continue;}if(tmp=="shut"){cout<<endl<<"Shut down the system successfully!"<<endl;cout<<"Have a good day!"<<endl;exit(0);}print_path();}}return 0;
}
/*** g++ a.cxx* ./a.out* * **/