跳蚤OS 是跳蚤国自主研发的功能强大的操作系统。

跳蚤OS的文件系统与普通的文件系统类似,是个文件夹套文件夹的结构。文件系统根目录称为“//”。我们可以用文件路径来表明文件所在的位置,比如“/flea/uoj/flea/uoj”表示根目录下的fleaflea文件夹下的uojuoj文件。

跳蚤OS的文件系统中。快捷方式是一种特殊的文件夹,点开该快捷方式相当于打开该快捷方式指向的文件夹。

比如,如果有一个快捷方式 “/etc/abc/etc/abc”,该快捷方式指向 “/flea/def/flea/def”这个文件夹,那么一旦访问“/etc/abc/etc/abc”就相当于访问“/flea/def/flea/def”。

这一天,跳蚤国王正在使用跳蚤OS。初始时文件系统为空,只有根目录。他每次会进行如下操作:

  1. 首先,随便写出两个文件路径 ss 和 tt。
  2. 接着,如果位置 tt 处不存在文件,则在该处创建一个空文件夹。
  3. 最后,跳蚤国王保证 ss 这个位置没有文件,于是在 ss 处创建一个快捷方式指向 tt。如果 tt 是个快捷方式,那么 ss 将指向 tt 所指向的文件夹。

上文所说的“创建”在父级目录不存在的时候要一并创建其父级目录。比如,假设文件系统里只有 “/v/v” 这个文件夹,那么现在我创建 “/v/flea/king/qaq/v/flea/king/qaq” 就会在文件系统中新增三个文件夹:“/v/flea/v/flea”, “/v/flea/king/v/flea/king”, “/v/flea/king/qaq/v/flea/king/qaq”。

跳蚤国王进行了 nn 次这样的操作后,开始不断问他的助手伏特:现在我如果在 pp 这个路径处创建一个文件夹(如果已存在则不创建),那么这个文件夹的真实路径是什么?

于是伏特只好向你求助了,请你帮一帮他吧!请参照样例来更清晰地理解题意。

输入格式

第一行两个正整数n,mn,m,表示跳蚤国王进行了nn个操作,提了mm个问题。

接下来nn行每行两个用空格隔开的字符串s,ts,t,表示跳蚤国王的一次操作。

接下来 mm 行每行一个字符串 pp 表示跳蚤国王的一个询问。

保证所有的 s,t,ps,t,p 都是合法的文件路径。即,文件夹名一定是由小写英文字母组成的非空字符串,路径名一定形如“/xxx/xxx/xxx/.../xxx/xxx/xxx/xxx/.../xxx”这样子。保证当路径不为根目录“//”时,路径不以“//”结尾。

输出格式

对于跳蚤国王的每个询问输出真实路径。

样例一

input

6 5
/root /
/duliu /picks
/vfk /vfleaking
/orz/orz/orz /duliu
/otl /duliu/duliu
/vfk/sb /vfleaking
/vfk/sb/nothing/nothing
/orz
/orz/orz/orz
/qaq
/otl

output

/vfleaking/nothing/nothing
/orz
/picks
/qaq
/picks/duliu

explanation

创建的快捷方式分别为:

  • /root→//root→/
  • /duliu→/picks/duliu→/picks
  • /vfk→/vfleaking/vfk→/vfleaking
  • /orz/orz/orz→/picks/orz/orz/orz→/picks
  • /otl→/picks/duliu/otl→/picks/duliu
  • /vfleaking/sb→/vfleaking/vfleaking/sb→/vfleaking

样例二

input

2 3
/ba/la /
/w/o/w /w
/ba/la/ba/la/ba/la/ba/la/ba/la/ba/la/ba/la
/ba/la/ba/la/ba/la/ba/la/ba/la/ba/la/ba/la/ba
/w/o/w/o/w/o/w/o

output

/
/ba
/w/o

样例三

见样例数据下载

限制与约定

测试点编号 nn mm 其他
1 ≤200≤200 ≤10≤10 保证单个字符串长度不会超过 4040
2
3
4 ≤20000≤20000 保证每个输入的路径字符串中仅包含一个“//”且位于字符串开头。
保证单个字符串长度不超过1515。
5
6
7 ≤20000≤20000  
8
9
10

对于所有数据,输入中路径字符串总长度不会超过 5×1055×105。

时间限制:1s1s

空间限制:256MB256MB

为了防止有些同学看晕了,我还是再罗嗦几句。下面的路径名都是非法的:

  • /orz//orz/
  • /orz//otl/orz//otl
  • /233/233 (注意,只能含有小写英文字母)

下面的路径名都是合法的:

  • //
  • /orz/otl/oorrzz/oottll/orz/otl/oorrzz/oottll
  • /a

【思路】

Trie+链接

给每个节点加个go指针,使之作为快捷方式链接真实路径字符串在 Trie 中对应的结点。

于是我们可以读入字符串,然后顺着Trie树走。当下一个字符是 “/” 或者已到达字符串结尾时,尝试从 go 指针跳转

【代码】

 #include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define FOR(a,b,c) for(int a=(b);a<=(c);a++)
using namespace std; const int N = *1e5+; int n,m;
char s[N],q[N]; struct Trie {
int sz; char b[N];
int ch[N][],go[N],fa[N];
Trie() { sz=; }
int insert() {
int u=;
scanf("%s",s);
int len=strlen(s);
if(s[len-]!='/') s[len++]='/';
for(int i=;i<len;i++) {
int c=s[i]-'a';
if(s[i]=='/') c=;
if(!ch[u][c]) {
ch[u][c]=++sz;
fa[sz]=u;
b[sz]=s[i];
}
u=ch[u][c];
if(s[i]=='/') while(go[u]) u=go[u];
}
return u;
}
}T; int main() {
scanf("%d%d",&n,&m);
for(int i=;i<n;i++) {
int x=T.insert(),y=T.insert();
T.go[x]=y;
}
for(int i=;i<m;i++) {
int x=T.insert();
int top=;
for(int i=x;i!=;i=T.fa[i])
q[++top]=T.b[i];
if(top==) puts("/");
else {
while(top>) printf("%c",q[top--]);
puts("");
}
}
return ;
}

【UER #1】跳蚤OS(Trie)的更多相关文章

  1. 【UER #1】[UOJ#12]猜数 [UOJ#13]跳蚤OS [UOJ#14]DZY Loves Graph

    [UOJ#12][UER #1]猜数 试题描述 这一天,小Y.小D.小C正在愉快地玩耍. 小Y是个数学家,他一拍脑袋冒出了一个神奇的完全平方数 n. 小D是个机灵鬼,很快从小Y嘴里套出了 n的值.然后 ...

  2. 【UOJ #13】【UER #1】跳蚤OS

    http://uoj.ac/problem/13 建立trie树,然后建立go指针, 和AC自动机里的fail指针差不多, 走到一个快捷方式就从go指针走. 注意在trie树上要保留字符'/',不能用 ...

  3. 【UOJ Easy Round #1】

    数论/Trie/并查集 猜数 这题我是这样分析的…… $a*b=g*l=n=k^2 \ and \ (g|a,g|b) \Rightarrow (g*a')*(g*b' )=g*l=k^2 \\ \R ...

  4. 查找(二)简单清晰的B树、Trie树具体解释

    查找(二) 散列表 散列表是普通数组概念的推广.因为对普通数组能够直接寻址,使得能在O(1)时间内訪问数组中的任何位置.在散列表中,不是直接把keyword作为数组的下标,而是依据keyword计算出 ...

  5. B树、Trie树详解

    查找(二) 散列表 散列表是普通数组概念的推广.由于对普通数组可以直接寻址,使得能在O(1)时间内访问数组中的任意位置.在散列表中,不是直接把关键字作为数组的下标,而是根据关键字计算出相应的下标. 使 ...

  6. OS X 与传统Unix的一点区别

    在传统的Unix系统或者Linux系统中,你是很难在根目录下找到大写开头的文件夹的, 但是看一下OS X: ls / Applications Users etc private var Develo ...

  7. NodeJs之OS

    OS Node.js提供了一些基本的底层操作系统的模块OS. API var os = require('os'); console.log('[arch] 操作系统CPU架构'+os.arch()) ...

  8. Node.js:OS模块

    os模块,可以用来获取操作系统相关的信息和机器物理信息,例如操作系统平台,内核,cpu架构,内存,cpu,网卡等信息. 使用如下所示: const os = require('os'); var de ...

  9. Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验

    Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...

随机推荐

  1. Python学习_Python 3.X版本导入httplib模块报ImportError解决方案

    之前用Python 2.7版本的httplib做接口测试时,运行代码都是正常的, 最近开始用Python 3.3之后,再去看以前的代码,发现import httplib出现错误:Unresolved ...

  2. XSS之学习误区分析

    有段时间没写东西了, 最近看到zone里出现了很多“XSS怎么绕过某某符号的帖子”,觉得很多新手在寻找XSS时走进了一些误区,比如:专门想着怎么去“绕过”.这里做个总结,希望对大家有所帮助. 1. 误 ...

  3. UVA 11736 Debugging RAM

    模拟题: 比赛的时候忘记把1变成64位的1了,跪了好久: #include<cstdio> #include<cstring> #include<map> #inc ...

  4. Angular2经典文章集锦

    Angular Metadata 等基础知识 http://www.jianshu.com/p/aeb11061b82c Metadata告诉Angular如何处理一个类,只有我们将它通告给Angul ...

  5. JniHelper 含安卓推送

    using System; using System.Runtime.CompilerServices; using UnityEngine; internal static class JniHel ...

  6. 如何用 Retrofit 2 在安卓上实现 HTTP 访问?

    最近,笔者对安卓开发的兴趣愈发浓厚,而且不断尝试了许多传闻很棒的开发库 -- 大部分也真的很不错.于是打算写一个系列文章,介绍使用这些让人惊叹的库建立安卓示例应用的实践.这样,读者可以自行判断,这些库 ...

  7. 想使用 MongoDB ,你应该了解这8个方面!

    应用性能高低依赖于数据库性能,MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案.MongoDB 是一个介于关系数据库和非关 ...

  8. [unity菜鸟] controller.SimpleMove(transform .forward); 无法移动

    今天做demo时遇到一个问题:当使用角色控制器操作物体,用 controller.SimpleMove(transform .forward); 语句时物体不能移动,搜索请教了很久,最后终于googl ...

  9. ANDROID_MARS学习笔记_S01原始版_012_广播机制一

    一.简介 二.代码1.xml(1)activity_main.xml <?xml version="1.0" encoding="utf-8"?> ...

  10. 《ArcGIS Engine+C#实例开发教程》第六讲 右键菜单添加与实现

    原文:<ArcGIS Engine+C#实例开发教程>第六讲 右键菜单添加与实现 摘要:在这一讲中,大家将实现TOCControl控件和主地图控件的右键菜单.在AE开发中,右键菜单有两种实 ...