题意:

在一些给定的目录里按要求展开到制定大小并按字典序输出

思路:

因为有目录这个东西,所以想到模拟一个类似字典树的东西,不过这里每个儿子可能有n个节点,而且不能O(1)查询了

代码超长。。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<stack>
#include<queue>
#include<deque>
#include<set>
#include<vector>
#include<map>
#include<functional> #define fst first
#define sc second
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define lc root<<1
#define rc root<<1|1
#define lowbit(x) ((x)&(-x)) using namespace std; typedef double db;
typedef long double ldb;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PI;
typedef pair<ll,ll> PLL; const db eps = 1e-;
const int mod = 1e9+;
const int maxn = 2e6+;
const int maxm = 2e6+;
const int inf = 0x3f3f3f3f;
const db pi = acos(-1.0); //vector<string>str;//每个编号对应的字符串
string str[ + ];
bool cmp(int a, int b){
return str[a] < str[b];
}
vector<int>v[ + ];//v[i]为i的孩子们
int tol = ;
int vis[ + ];//结尾节点
int vl[ + ];//节点的值
int T;
void insert(vector<string>s, int val){
int root = ;
int sz = s.size();
for(int i = ; i < sz; i++){
//cout << i << " "<<s[i]<<endl;
int flg = ;
for(int j = ; j < (int)v[root].size(); j++){
if(str[v[root][j]] == s[i]){
root = v[root][j];
flg = ;
break;
}
}
if(!flg){
//cout << " bug "<<tol<<endl;
v[root].pb(tol);
str[tol] = s[i];
if(i==(sz-)){
vis[tol] = ;
vl[tol] = val;
}
root = tol++;
}
}
return;
}
int size[ + ];
int readydfs(int root){
int sz = v[root].size();
int res = ;
if(sz == ){
return vl[root];
}
int flg = ;
//cout << root << " "<<str[root]<<endl;
for(int i = ; i < sz; i++){
//cout << v[root][i] << " " << str[v[root][i]]<<endl;
if(vis[v[root][i]] != ){
flg = ;
}
res += readydfs(v[root][i]);
}
if(!flg) vis[root] = ; return vl[root] = res;
}
void dfs(int root, string s, int c){
int sz = v[root].size();
int flg = ;
if(vis[root]==)flg = ;
if(vl[root] < T){
if(vis[root] == ) flg = ;
else flg = ;
}
//cout << s <<endl;
/*if(flg == 0){
cout<<"- "<<s<<"/ "<<vl[root]<<endl;
}*/
if(flg == ){
cout <<" "<<s<<"/ "<<vl[root]<<endl;
return;
}
else if(flg == ){
cout << "+ "<<s<<"/ "<<vl[root]<<endl;
return;
}
sort(v[root].begin(), v[root].end(), cmp);
int vv = ;
for(int i = ; i < sz; i++){
if(vis[v[root][i]]!=){
if(vv &&vl[v[root][i]]>=T){
cout<<"- "<<s<<"/ "<<vl[root]<<endl;
vv = ;
break;
}
//if(flg == 3) dfs(v[root][i], s+"/"+str[v[root][i]], 0); }
}
if(!vv){
for(int i = ; i < sz; i++){
if(vis[v[root][i]]!=){ dfs(v[root][i], s+"/"+str[v[root][i]], ); }
}
}
else cout << "+ "<<s<<"/ "<<vl[root]<<endl;
return;
}
int main() {
tol = ;
str[] = "/";
mem(vis, );
mem(vl, );
ios::sync_with_stdio(false);
int n;
cin >> n;
string tmp;
for(int t = ; t <= n; t++){
int val;
cin >> tmp >> val;
int len = tmp.size();
vector<string>s;
int p = ;
for(int i = ; i < len; i++){
if(i && (tmp[i] == '/')){
s.pb(tmp.substr(p+, i-p-));
p = i;
}
if(i == len - ){
s.pb(tmp.substr(p+, i-p));
}
}
insert(s, val);
}
readydfs();
/*for(int i = 0; i < tol; i++){
cout << i <<" "<<vl[i]<<endl;
}*/
cin >> T;
string s = "";
dfs(, s, );
return ;
}

CERC2017 H Hidden Hierarchy(树+模拟)的更多相关文章

  1. Gym - 101620H_Hidden Hierarchy(树+模拟)

    Hidden Hierarchy 题目链接 题目描述 You are working on the user interface for a simple text-based file explor ...

  2. hdu_5818_Joint Stacks(线段树模拟)

    题目链接:hdu_5818_Joint Stacks 题意: 给你两个栈,多了个合并操作,然后让你模拟 题解: 很容易想到O(1)的单个栈操作,O(n)的合并操作,这样肯定超时,所以我们要将时间复杂度 ...

  3. 【CF280D】 k-Maximum Subsequence Sum ,线段树模拟费用流

    昨天考试被教育了一波.为了学习一下\(T3\)的科技,我就找到了这个远古时期的\(cf\)题(虽然最后\(T3\)还是不会写吧\(QAQ\)) 顾名思义,这个题目其实可以建成一个费用流的模型.我们用流 ...

  4. 2019牛客暑期多校训练营(第八场)E:Explorer(LCT裸题 也可用线段树模拟并查集维护连通性)

    题意:给定N,M,然后给出M组信息(u,v,l,r),表示u到v有[l,r]范围的通行证有效.问有多少种通行证可以使得1和N连通. 思路:和bzoj魔法森林有点像,LCT维护最小生成树.  开始和队友 ...

  5. hdu3436 splaytree树模拟队列+离散化缩点

    数据较大,需要先把每个top不会操作到的段缩成一个点,记录其开始和结束的位置,和top能操作到的点一起建立一颗伸展树模拟 然后就是普通的队列模拟操作 /* 不会被top操作到的区间就缩点 通过spla ...

  6. poj2828 伸展树模拟

    用伸展树模拟插队比线段树快乐3倍.. 但是pojT了.别的oj可以过,直接贴代码. 每次更新时,找到第pos个人,splay到根,然后作为新root的左子树即可 #include<iostrea ...

  7. C/C++深度优先搜索(递归树模拟)

    //C++深度优先搜索(递归树模拟) #define _CRT_SECURE_NO_WARNINGS #include <iostream> #define MAX_N 1000 usin ...

  8. hdu 5475 模拟计算器乘除 (2015上海网赛H题 线段树)

    给出有多少次操作 和MOD 初始值为1 操作1 y 表示乘上y操作2 y 表示除以第 y次操作乘的那个数 线段树的叶子结点i 表示 第i次操作乘的数 将1替换成y遇到操作2 就把第i个结点的值 替换成 ...

  9. 主席树/线段树模拟归并排序+二分答案(好题)——hdu多校第4场08

    用主席树写起来跑的快一点,而且也很傻比,二分答案,即二分那个半径就行 主席树求的是区间<=k的个数 #include<bits/stdc++.h> using namespace s ...

随机推荐

  1. 为什么大家都说Java中只有值传递?

    最近跟Java中的值传递和引用传递杠上了,一度怀疑人生.查了很多资料,加上自己的理解,终于搞清楚了,什么是值传递和引用传递.也搞明白了,为什么大家都说Java只有值传递,没有引用传递.原来,我一直以来 ...

  2. mysql-5.7.9-winx64遇坑记

    昨天在mysql5.0上导入sql文件时,一直卡在一个地方报错,也没仔细分析,认为应该是mysql版本太低不支持这个语法而已.遂决心下载一个最新版本的mysql,却浑然不知前面无数的坑已经埋伏好了在等 ...

  3. 基于Arduino的按键控制LED实验

    I/O 口的意思即为INPUT 接口和OUTPUT 接口,到目前为止我们设计的小灯实验都还只是应用到Arduino 的I/O 口的输出功能,这个实验我们来尝试一下使用Arduino的I/O 口的输入功 ...

  4. 升级添加到现有iOS Xcode项目的Flutter

    如果你在2019年8月之前将Flutter添加到现有iOS项目,本文值得你一看. 在2019年7月30日,合并合并请求flutter / flutter#36793之前Flutter 1.8.4-pr ...

  5. 浏览器从输入url 到页面展示完成响应过程

    用户从输入 url 到浏览器响应,呈现给用户的具体过程 1.用户在输入栏输入地址 (1) 如果有 beforeunload 事件会先执行判断继续还是跳出操作 (2) 浏览器进程识别是 地址还是关键字检 ...

  6. 倍增LCA模板

    //https://www.luogu.org/problemnew/show/P3379#include<bits/stdc++.h> #define maxn 500010 #defi ...

  7. 继承Exception⭐⭐

    public class ECOrderException : Exception { //第一种类型: throw new ECOrderException { ErrorCode = " ...

  8. 安装SQL的时候,设置用户权限失败

    在安装sql的时候,遇到一个问题: 在查看报表明细中,提示: 就是这三个: 首先确保你是使用管理员用户安装的,如果还不行,运行 secpol.msc 进入本地安全策略 把自己的用户名加入进来就好了.

  9. java 中文乱码问题

    1.要记住的事实 java的class文件是utf-8编码的,jvm使用utf-16,而java的字符串使用unicode编码 2.java支持的字符集 java支持的字符集可以通过java.nio. ...

  10. hdu6601 主席树

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6601 Problem Description N sticks are arranged in a r ...