【UOJ #13】【UER #1】跳蚤OS
http://uoj.ac/problem/13
建立trie树,然后建立go指针,
和AC自动机里的fail指针差不多,
走到一个快捷方式就从go指针走。
注意在trie树上要保留字符'/',不能用end标记来标识一个字符串的结束。
因为可能出现"/Iam/zz"和"/Iamzz"这两种情况,如果只用end标记,tire树上这两个字符串就会共用一条路径。
(总之是蒟蒻才会犯的错误,神犇们勿喷_(:з」∠)_)
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int in() {
int k = 0; char c = getchar();
for(; c < '0' || c > '9'; c = getchar());
for(; c >= '0' && c <= '9'; c = getchar())
k = k * 10 + c - 48;
return k;
}
struct State {
int num;
State *nxt[27], *go, *fa;
State(State *_fa, int _num) {
memset(nxt, 0, sizeof(nxt));
go = 0; fa = _fa; num = _num;
}
} *root;
State *to(char *c) {
int len = strlen(c), x;
if (len == 1 && c[0] == '/') return root;
State *tmp = root;
for(int i = 0; i < len; ++i) {
if (c[i] == '/') x = 26;
else x = c[i] - 'a';
if (tmp->nxt[x] == 0)
tmp->nxt[x] = new State(tmp, x);
tmp = tmp->nxt[x];
if ((c[i + 1] == '\0' || c[i + 1] == '/') && tmp->go)
tmp = tmp->go;
}
return tmp;
}
char s[500003], t[500003];
void print(State *tmp) {
int tot = 0;
if (tmp == root) {puts("/"); return;}
while (tmp != root) {
if (tmp->num <= 25) t[++tot] = 'a' + tmp->num;
else t[++tot] = '/';
tmp = tmp->fa;
}
while (tot) putchar(t[tot--]);
puts("");
}
int n, m;
int main() {
root = new State(0, 0);
n = in(); m = in();
for(int i = 1; i <= n; ++i) {
scanf("%s", s); scanf("%s", t);
to(s)->go = to(t);
}
for(int i = 1; i <= m; ++i) {
scanf("%s", s);
print(to(s));
}
return 0;
}
【UOJ #13】【UER #1】跳蚤OS的更多相关文章
- 【UER #1】[UOJ#12]猜数 [UOJ#13]跳蚤OS [UOJ#14]DZY Loves Graph
[UOJ#12][UER #1]猜数 试题描述 这一天,小Y.小D.小C正在愉快地玩耍. 小Y是个数学家,他一拍脑袋冒出了一个神奇的完全平方数 n. 小D是个机灵鬼,很快从小Y嘴里套出了 n的值.然后 ...
- 【UER #1】跳蚤OS(Trie)
跳蚤OS 是跳蚤国自主研发的功能强大的操作系统. 跳蚤OS的文件系统与普通的文件系统类似,是个文件夹套文件夹的结构.文件系统根目录称为“//”.我们可以用文件路径来表明文件所在的位置,比如“/flea ...
- UOJ #455 [UER #8]雪灾与外卖 (贪心、模拟费用流)
题目链接 http://uoj.ac/contest/47/problem/455 题解 模拟费用流,一个非常神奇的东西. 本题即为WC2019 laofu的讲课中的Problem 8,经典的老鼠进洞 ...
- [UOJ#245][UER#7]天路(近似算法)
允许5%的相对误差,意味着我们可以只输出$\log_{1.05} V$种取值并保证答案合法.并且注意到答案随着区间长度而单增,故取值不同的答案区间是$O(\log_{1.05} V)$的. 于是初始x ...
- 【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 ...
- Python os模块介绍
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录:相当于shell下cd os.curd ...
- (原创)Python文件与文件系统系列(2)——os模块对文件、文件系统操作的支持
os模块的功能主要包括文件系统部分和进程管理部分,这里介绍其中与文件系统相关的部分. 当请求操作系统执行操作失败时,os模块抛出内置异常 exceptions.OSError 的实例,可以通过 os. ...
- python3之OS与sys模块
一.Python os模块 包含普遍的操作系统功能,如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的. 1.os.access() 查看文件是否有指定权限,有则返回True否则返回flase ...
- 从安装Mac OS X虚拟机到第一个IOS程序
对于纯粹地抄这种行为是比较抵触的,别人已经写得挺好的东西没必要又去写一遍,但如果不写经验来看下次再做时自己又要重复百度筛选一遍,所以还是要记一记. 之前要获取IOS静态库的版本,但一直以来没有Mac没 ...
随机推荐
- gcc boost版本冲突解决日记
问题背景 项目在Ubuntu10 64位 boost 1.55,boost采用的是项目内包含相对目录的形式部署 项目采用了 -Wall -Wextra -Werror -Wconversion 最高的 ...
- iOS 10 都有什么改变?
iOS 10 都有什么改变? 看这一个贴就够了 最全面的试用 苹果在 WWDC 2016 发布会上正式发布了 iOS 10 操作系统,iOS 与 macOS.tvOS 和 watchOS 构建了苹果四 ...
- Linux(RHEL6.0)下安装GCC
查看系统版本 [root@CP-RHEL proc]# cat /etc/issue Red Hat Enterprise Linux Server release 6.0 (Santiago) Ke ...
- 创建版本库-GIT
什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改.删除,Git都能跟踪,以便任何时刻都可以追踪历史,或 ...
- <<你的灯亮着吗?>>读书笔记
本书是美国计算机传奇人物杰拉尔德.温伯格和唐纳德.高斯所著,我在网上买到的2003年版的本书,发现本书用20则幽默的现代寓言故事,60幅精美插图,以及一系列的适当提问和建议,让我们的思考方式慢慢得以扩 ...
- ORACLE告警日志文件
告警日志介绍 告警日志文件是一类特殊的跟踪文件(trace file).告警日志文件命名一般为alert_<SID>.log,其中SID为ORACLE数据库实例名称.数据库告警日志是按时间 ...
- You must use the Role Management Tool to install or configure Microsoft .NET Framework 3.5 SP1
今天在Windows Server 2008 下安装SQL SERVER 2008时,碰到如下错误: You must use the Role Management Tool to install ...
- winform(三)——更换主窗体例子
做一个登录窗口,登录成功时关闭form1,展示from2界面 1.主界面Login namespace WindowsFormsApplication1 { public partial class ...
- [MySQL Reference Manual] 10 全球化
10.全球化 本章主要介绍全球化,包含国际化和本地化,的一些问题: · MySQL在语句中支持的字符集 · 如何为服务配置不同的字符集 · 选择错误信息 ...
- 手把手教你编译安装MariaDB
MariaDB是什么? MariaDB是MySQL的一个分支,由于Oracle有可能对MySQL闭源,所以分离了出来(MySQL先后被Sun.Oracle收购). 但是除了作为一个Mysql的&quo ...