2775:文件结构“图”
2020年7月1日更新内容:
重新复习C++,所以用C++重写了一遍,指针好久不用是真的头疼,还好AC了。
// inserting into a vector
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <iomanip>
#include <stack>
using namespace std;
void inlineprifix(int layer) {
for (int i = 0; i < layer; i++) {
cout << "| ";
}
}
typedef struct FileDirType{
string dirname;
vector<string> filelist;
int layer_level;
vector<struct FileDirType*> filedirtype;
}MyFileDirType;
void ppprint(MyFileDirType content) {
inlineprifix(content.layer_level);
cout << content.dirname << endl;
for (vector<struct FileDirType*>::iterator it = content.filedirtype.begin(); it != content.filedirtype.end(); it++) {
ppprint(**it);
}
sort(content.filelist.begin(), content.filelist.end());
for (vector<string>::iterator it = content.filelist.begin(); it != content.filelist.end(); it++) {
inlineprifix(content.layer_level);
cout << *it << endl;
}
}
int main() {
stack<MyFileDirType*> SYSSTACK;
int layer_counter = 0;
MyFileDirType ROOT;
ROOT.dirname = "ROOT";
ROOT.layer_level = layer_counter;
MyFileDirType* currenroot;
currenroot = &ROOT;
string input;
int total_times = 1;
while (cin >> input) {
if (input[0] == 'f') {
currenroot->filelist.push_back(input);
}
if (input[0] == 'd') {
layer_counter += 1;
MyFileDirType* newone = new MyFileDirType;
newone->dirname = input;
newone->layer_level = layer_counter;
currenroot->filedirtype.push_back(newone);
SYSSTACK.push(currenroot);
currenroot = newone;
}
if(input[0] == ']'){
currenroot = SYSSTACK.top();
SYSSTACK.pop();
layer_counter -= 1;
}
if (input[0] == '*') {
cout << "DATA SET " << total_times << ":" << endl;
ppprint(ROOT);
total_times += 1;
layer_counter = 0;
while (!SYSSTACK.empty()) {
SYSSTACK.pop();
}
ROOT.filelist.clear();
ROOT.filedirtype.clear();
currenroot = &ROOT;
cout << endl;
}
if (input[0] == '#') {
break;
}
}
return 0;
}
2020年6月10日内容:
逻辑想清楚了就能做
我用的几乎全是字符串操作,没有在打印的时候优化,而是什么都用字符串操作了,所以确实慢
附一张一遍过的时候的榜单,看看我多慢
# 百练 / 2775:文件结构“图”
# http://bailian.openjudge.cn/practice/2775
# Author:NitrogenousFish
# github:https://github.com/NITROGENousFish/
arr = []
def formatttt(num):
return "| "*num
def printfunc(arr,index):
print("DATA SET "+str(index+1)+":")
print("ROOT")
for item in arr:
print(item)
print()
def main():
global arr
arr_temp = []
while True:
something = input()
if something == "#":
break
elif something == "*":
arr.append(arr_temp)
arr_temp = []
else:
arr_temp.append(something)
def deal1(arr,layer):
# layer = 0
filelist = []
index = 0
outputlist = []
while index <len(arr):
if arr[index][0] == "f":
filelist.append(formatttt(layer)+arr[index])
index+=1
elif arr[index][0] == "d":
start = index
pos = index
youkuohaotimes = 1
while youkuohaotimes !=0:
pos += 1
if arr[pos][0] == "d":
youkuohaotimes +=1
if arr[pos][0] == "]":
youkuohaotimes -=1
#dir变成下一级 #后面的里被OA
outputlist = outputlist+[formatttt(layer+1)+arr[start]]+deal1(arr[start+1:pos],layer+1)
index = pos+1
else:
return
filelist = sorted(filelist)
return outputlist+filelist
for index,arr_thing in enumerate(arr):
printfunc(deal1(arr_thing,0),index)
if __name__ == "__main__":
main()