CERC2017 H Hidden Hierarchy(树+模拟)
题意:
在一些给定的目录里按要求展开到制定大小并按字典序输出
思路:
因为有目录这个东西,所以想到模拟一个类似字典树的东西,不过这里每个儿子可能有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(树+模拟)的更多相关文章
- Gym - 101620H_Hidden Hierarchy(树+模拟)
Hidden Hierarchy 题目链接 题目描述 You are working on the user interface for a simple text-based file explor ...
- hdu_5818_Joint Stacks(线段树模拟)
题目链接:hdu_5818_Joint Stacks 题意: 给你两个栈,多了个合并操作,然后让你模拟 题解: 很容易想到O(1)的单个栈操作,O(n)的合并操作,这样肯定超时,所以我们要将时间复杂度 ...
- 【CF280D】 k-Maximum Subsequence Sum ,线段树模拟费用流
昨天考试被教育了一波.为了学习一下\(T3\)的科技,我就找到了这个远古时期的\(cf\)题(虽然最后\(T3\)还是不会写吧\(QAQ\)) 顾名思义,这个题目其实可以建成一个费用流的模型.我们用流 ...
- 2019牛客暑期多校训练营(第八场)E:Explorer(LCT裸题 也可用线段树模拟并查集维护连通性)
题意:给定N,M,然后给出M组信息(u,v,l,r),表示u到v有[l,r]范围的通行证有效.问有多少种通行证可以使得1和N连通. 思路:和bzoj魔法森林有点像,LCT维护最小生成树. 开始和队友 ...
- hdu3436 splaytree树模拟队列+离散化缩点
数据较大,需要先把每个top不会操作到的段缩成一个点,记录其开始和结束的位置,和top能操作到的点一起建立一颗伸展树模拟 然后就是普通的队列模拟操作 /* 不会被top操作到的区间就缩点 通过spla ...
- poj2828 伸展树模拟
用伸展树模拟插队比线段树快乐3倍.. 但是pojT了.别的oj可以过,直接贴代码. 每次更新时,找到第pos个人,splay到根,然后作为新root的左子树即可 #include<iostrea ...
- C/C++深度优先搜索(递归树模拟)
//C++深度优先搜索(递归树模拟) #define _CRT_SECURE_NO_WARNINGS #include <iostream> #define MAX_N 1000 usin ...
- hdu 5475 模拟计算器乘除 (2015上海网赛H题 线段树)
给出有多少次操作 和MOD 初始值为1 操作1 y 表示乘上y操作2 y 表示除以第 y次操作乘的那个数 线段树的叶子结点i 表示 第i次操作乘的数 将1替换成y遇到操作2 就把第i个结点的值 替换成 ...
- 主席树/线段树模拟归并排序+二分答案(好题)——hdu多校第4场08
用主席树写起来跑的快一点,而且也很傻比,二分答案,即二分那个半径就行 主席树求的是区间<=k的个数 #include<bits/stdc++.h> using namespace s ...
随机推荐
- 对接百度地图API 实现地址转经纬度
<?php class BaiduLBS { public static $_ak = '你的KEY值'; # Util::request 是我封装的一个请求URL类,自己可以写一个 可以提交 ...
- redis 为什么是单线程,为什么速度快。
redis 5中存储方式 String.List.Set.Hash.ZSet这5种 数据库的工作模式按存储方式可分为: 硬盘数据库和内存数据库.Redis 将数据储存在内存里面,读写数据的时候都不会受 ...
- 我该如何学习spring源码以及解析bean定义的注册
如何学习spring源码 前言 本文属于spring源码解析的系列文章之一,文章主要是介绍如何学习spring的源码,希望能够最大限度的帮助到有需要的人.文章总体难度不大,但比较繁重,学习时一定要耐住 ...
- 【一起学源码-微服务】Feign 源码一:源码初探,通过Demo Debug Feign源码
前言 前情回顾 上一讲深入的讲解了Ribbon的初始化过程及Ribbon与Eureka的整合代码,与Eureka整合的类就是DiscoveryEnableNIWSServerList,同时在Dynam ...
- vmware workstation12在安装VMware tools时出现问题:A previous installation of VMware Tools has been detected 解决
win10安装的vmware workstation12在安装VMware tools时出现问题: root@lc:/root/vmware-tools-distrib# ./vmware-insta ...
- 体验.NET Core 命令行应用程序-CommandLineUtils
前言 在我们开发中可能需要设计一次性应用程序,这些实用程序可以利用接近原始源代码的优势,但可以在与主Web应用程序完全独立的安全性上下文中启动.具体在 [管理过程](https://12factor. ...
- python中各种文件打开模式
在python中,总的来说有三种大的模式打开文件,分别是:a, w, r 当以a模式打开时,只能写文件,而且是在文件末尾添加内容. 当以a+模式打开时,可以写文件,也可读文件,可是在读文件的时候,会发 ...
- NTT - 牛客
链接:https://www.nowcoder.com/acm/contest/133/D来源:牛客网 题目描述 Applese打开了m个QQ群,向群友们发出了组队的邀请.作为网红选手,Applese ...
- Window同一电脑配置多个git公钥
前言 配置多个本地ssh-key之前,先初始化下GIt环境哦! 可以参照:https://www.cnblogs.com/poloyy/p/12185132.html 执行前两步就好啦 本地生成两个s ...
- python面向对象(一切皆对象)
使用面向对象的思想设计一个乌龟的角色: 表面特征:绿色.有4条腿.重10kg.有外壳等等 行为特征:爬.吃.睡觉.将头和四肢缩到壳里等等 class tortoise: bodycolor = &qu ...