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; }
-
02020-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;
}
``` -
02018-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; }
-
02018-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");
}
}
} -
02017-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; }
-
02016-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;
}
``` -
02012-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上测样例的时候,文件读完但是必须手动跳出
忐忑的提交上去结果竟然过了…… -
02009-11-08 11:54:36@
100AC!
开始写了60行超时了 .. 后来写了个20行的递归就过了
-
02009-11-06 21:15:49@
建议楼下在递归中用ansistring的,当心栈溢出
还有,郁闷的是,题目说过每行字符不超过25的,结果数据都是255 = =!!!
-
02009-10-23 22:57:43@
ansistring和string的差别就是50分!!
-
02009-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; -
02009-10-08 12:43:18@
右斜杠打成左斜杠了…………囧
-
02009-10-07 21:14:27@
这种题一次AC。
我太崇拜我自己了。
-
02009-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次 -
02009-09-19 15:32:18@
悲剧啊..
太久没写递归了 -
02009-09-17 21:06:03@
卧槽, 超过25的啊- - 槽死
-
02009-09-15 13:01:18@
这 是 为 什 么 呢-3-
谁 告 诉 我 应 该 怎 么 读 入-3-
谢 谢 拉0 0 -
02009-09-15 12:36:15@
没有一次AC....
我没用大牛说的递归啊,直接用WHILE循环弄的。
此题很水。
注意的是判断文件夹是否读完不能用IF,要用WHILE,我就是因为这个才过了50分.... -
02009-09-14 20:43:47@
'/' '\'大反了
-
02009-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