58 条题解
- 
  1niujinyu LV 10 @ 2022-07-19 18:06:08 #include <iostream> #include <string> using namespace std; string stack[300], aim; int top; void solution(string tmp) { int branch = top; if(tmp.find('.') == string::npos) { stack[top++] = tmp; int num; string tmp1; cin >> num; for(int i = 0; i < num; i++) { cin >> tmp1; solution(tmp1); } } else { stack[top++] = tmp; if(tmp == aim) { for(int i = 0; i < top - 1; i++) cout << stack[i] << '\\'; cout << stack[top-1] << endl; } } top = branch; } int main() { cin >> aim; string tmp; while(cin >> tmp) solution(tmp); return 0; }
- 
  0@ 2020-06-13 19:22:07多叉树带父节点 
 ```cpp
 #include<iostream>
 #include<vector>
 #include<stack>
 using namespace std;
 class Tree {
 public:
 bool file;
 string name;
 int children_num=0;
 vector<Tree*> children;
 Tree* father=nullptr;
 Tree(bool file,string name,Tree *father) {
 this->name = name;
 this->file = file;
 this->father = father;
 }
 };
 void find(Tree node,string keyword) {
 stack<string> path;
 while (node!=nullptr){
 path.push(node->name);
 node = node->father;
 }
 while (!path.empty()){
 cout << path.top();
 path.pop();
 }
 cout << endl;
 }
 Tree new_dir(string name,int child_num,Tree* father,string keyword) {
 Tree* tree = new(Tree)(false, name+"\",father);
 tree->children_num = child_num;for (int i = 0; i < child_num; i++) { 
 string child_name;
 cin >> child_name;
 if (child_name.find(".")==name.npos) {
 int num;
 cin >> num;
 tree->children.push_back(new_dir(child_name, num, tree,keyword));
 }
 else {
 Tree* child = new(Tree)(true,child_name,tree);
 tree->children.push_back(child);
 if (child->name == keyword) {
 find(child, keyword);
 }
 }
 }
 return tree;
 }int main() { 
 string keyword;
 cin >> keyword;
 Tree* root = new(Tree)(false, "", nullptr);
 string name;
 while (cin>>name){
 if (name.find(".")!=name.npos) {
 Tree* tree = new(Tree)(true, name, root);
 root->children.push_back(tree);
 if (tree->name == keyword) {
 find(tree, keyword);
 }
 }
 else {
 int num;
 cin >> num;
 Tree* tree = new_dir(name,num,root,keyword);
 root->children.push_back(tree);
 }
 root->children_num++;
 }
 return 0;
 }
 ```
- 
  0@ 2018-08-11 19:29:37递归大法好 #include<iostream> #include<queue> #include<cstdio> #include<cstring> #include<algorithm> #include<stack> #include<vector> #define N 2000 using namespace std; void in(int &x){ register char c=getchar();x=0;int f=1; while(!isdigit(c)){if(c=='-') f=-1;c=getchar();} while(isdigit(c)){x=x*10+c-'0';c=getchar();} x*=f; } string an,s,ans[N]; string S[N]; bool flg=0; void dg(int cnt){ s=""; while(cin>>s) break; if(s=="") {flg=1;return;} S[cnt]=s; int l=s.length(); if(s.find('.')!=string::npos){ if(s==an){ for(int i=1;i<=cnt-1;i++) cout<<S[i]<<"\\"; cout<<an<<"\n"; } } else { int p; cin>>p; for(int i=1;i<=p;i++) dg(cnt+1); }return; } int main() { cin>>an; while(1){ dg(1); if(flg) break; }return 0; }
- 
  0@ 2018-08-10 15:21:19按照文件夹样式建图模拟,最后查询即可。 
 #include <algorithm>
 #include <iostream>
 #include <cstring>
 #include <cstdio>
 #include <queue>
 #include <map>
 using namespace std;
 #define N int(3e3+2)
 #define M int(1e5+2)
 int top,stack[N],belong[N],sck[N],sum,p;
 map <int,string> f;
 string s,t;
 struct ahah{
 int nxt,to;
 }edge[N];
 int head[N],tot;
 void add(int x,int y)
 {
 edge[++tot].nxt=head[x],edge[tot].to=y,head[x]=tot;
 }
 void dfs(int s)
 {
 if(s==0)return ;
 stack[++top]=s;
 for(int i=head[s];i;i=edge[i].nxt)
 dfs(edge[i].to);
 }
 int main()
 {
 cin>>s;
 while(cin>>t)
 {
 while(top&&stack[top]==0)top--,sum--;
 f[++p]=t;
 if(t.find(".")==-1)
 {
 stack[top]--;
 add(p,sck[sum]);
 scanf("%d",&stack[++top]);
 sck[++sum]=p;
 continue;
 }
 stack[top]--;
 add(p,sck[sum]);
 }
 for(int i=1;i<=p;i++)
 {
 if(f[i]==s)
 {
 dfs(i);
 cout<<f[stack[top]];
 for(int i=top-1;i>=1;i--)if(stack[i]!=0)cout<<"\"<<f[stack[i]];
 top=0;
 printf("\n");
 }
 }
 }
- 
  0@ 2017-08-31 11:52:55//弱弱的递归,用branch记录上一个位置 #include <iostream> #include <string> using namespace std; string stack[300], aim; int top; void solution(string tmp) { int branch = top; if(tmp.find('.') == string::npos) { stack[top++] = tmp; int num; string tmp1; cin >> num; for(int i = 0; i < num; i++) { cin >> tmp1; solution(tmp1); } } else { stack[top++] = tmp; if(tmp == aim) { for(int i = 0; i < top - 1; i++) cout << stack[i] << '\\'; cout << stack[top-1] << endl; } } top = branch; } int main() { cin >> aim; string tmp; while(cin >> tmp) solution(tmp); return 0; }
- 
  0@ 2016-08-21 16:28:13弱数据,直接递归即可AC 
 ```c++
 #include <bits/stdc++.h>
 using namespace std;string str; bool work(const string &pos) 
 {
 string ths;
 if (!(cin >> ths)) return 0;
 if (ths.find('.') == string::npos) {
 int d; cin >> d;
 for (int i = 1; i <= d; i++)
 if(!work(pos+ths+'\'))
 throw;
 } else {
 if (ths == str)
 puts((pos+ths).c_str());
 }
 return 1;
 }int main() 
 {
 cin >> str;
 while (work(""));
 return 0;
 }
 ```
- 
  0@ 2012-11-07 20:01:27编译通过... 
 ├ 测试数据 01:答案正确... (12ms, 1536KB)
 ├ 测试数据 02:答案正确... (0ms, 1536KB)
 ├ 测试数据 03:答案正确... (0ms, 1536KB)
 ├ 测试数据 04:答案正确... (0ms, 1536KB)
 ├ 测试数据 05:答案正确... (0ms, 1536KB)
 ├ 测试数据 06:答案正确... (123ms, 1536KB)
 ├ 测试数据 07:答案正确... (124ms, 1536KB)
 ├ 测试数据 08:答案正确... (124ms, 1536KB)
 ├ 测试数据 09:答案正确... (218ms, 1536KB)
 ├ 测试数据 10:答案正确... (137ms, 1536KB)---|---|---|---|---|---|---|---|- 
 Accepted / 100 / 742ms / 1536KB
 递归就可以了
 在自己的FP上测样例的时候,文件读完但是必须手动跳出
 忐忑的提交上去结果竟然过了……
- 
  0@ 2009-11-08 11:54:36100AC! 开始写了60行超时了 .. 后来写了个20行的递归就过了 
- 
  0@ 2009-11-06 21:15:49建议楼下在递归中用ansistring的,当心栈溢出 还有,郁闷的是,题目说过每行字符不超过25的,结果数据都是255 = =!!! 
- 
  0@ 2009-10-23 22:57:43ansistring和string的差别就是50分!! 
- 
  0@ 2009-10-22 17:39:53第一反应是非递归写法。。。 
 很容易知道,只需要维护一个栈,当且仅当读入的为文件时,减少当前元素的儿子数,读入的为文件夹时,增加当前的元素个数。
 非递归的精髓在于pop的过程,以下贴出这段过程:
 procedure pop(var p:longint); //p指针指空
 begin
 dec(stack[p-1].s);
 while stack[p-1].s=0 do
 begin
 dec(p);
 dec(stack[p-1].s);
 end;
 end;
- 
  0@ 2009-10-08 12:43:18右斜杠打成左斜杠了…………囧 
- 
  0@ 2009-10-07 21:14:27这种题一次AC。 我太崇拜我自己了。 
- 
  0@ 2009-10-06 21:36:42编译通过... 
 ├ 测试数据 01:答案正确... 0ms
 ├ 测试数据 02:答案正确... 0ms
 ├ 测试数据 03:答案正确... 0ms
 ├ 测试数据 04:答案正确... 0ms
 ├ 测试数据 05:答案正确... 0ms
 ├ 测试数据 06:答案正确... 0ms
 ├ 测试数据 07:答案正确... 0ms
 ├ 测试数据 08:答案正确... 0ms
 ├ 测试数据 09:答案正确... 0ms
 ├ 测试数据 10:答案正确... 0ms
 ---|---|---|---|---|---|---|---|-
 Accepted 有效得分:100 有效耗时:0ms
 晕 if 与 while 打错了 白交了n次
- 
  0@ 2009-09-19 15:32:18悲剧啊.. 
 太久没写递归了
- 
  0@ 2009-09-17 21:06:03卧槽, 超过25的啊- - 槽死 
- 
  0@ 2009-09-15 13:01:18这 是 为 什 么 呢-3- 谁 告 诉 我 应 该 怎 么 读 入-3- 
 谢 谢 拉0 0
- 
  0@ 2009-09-15 12:36:15没有一次AC.... 
 我没用大牛说的递归啊,直接用WHILE循环弄的。
 此题很水。
 注意的是判断文件夹是否读完不能用IF,要用WHILE,我就是因为这个才过了50分....
- 
  0@ 2009-09-14 20:43:47'/' '\'大反了 
- 
  0@ 2009-09-12 23:03:21编译通过... 
 ├ 测试数据 01:答案正确... 0ms
 ├ 测试数据 02:答案正确... 0ms
 ├ 测试数据 03:答案正确... 0ms
 ├ 测试数据 04:答案正确... 0ms
 ├ 测试数据 05:答案正确... 0ms
 ├ 测试数据 06:答案正确... 0ms
 ├ 测试数据 07:答案正确... 0ms
 ├ 测试数据 08:答案正确... 0ms
 ├ 测试数据 09:答案正确... 0ms
 ├ 测试数据 10:答案正确... 0ms
 ---|---|---|---|---|---|---|---|-
 Accepted 有效得分:100 有效耗时:0ms呜呜呜 没一次AC