我是靠谱客的博主 帅气小白菜,最近开发中收集的这篇文章主要介绍UOJ#13【UER#1】跳蚤OS,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目链接:http://uoj.ac/problem/13


【分析】

    建一棵Trie树,然后基本上就是一个裸的Trie了,记录一下父亲节点和是否是快捷方式即可。


【代码】

#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=500010,inf=~0U>>1;

struct Trie
{
	int ch[maxn][27],fa[maxn];
	char chi[maxn],temp[maxn];
	int length[maxn];
	int To[maxn];
	int cnt;
	
	int d(char chx) {if (chx=='/') return 26;return chx-'a';}
	
	Trie() {cnt=1;chi[1]='/';}
	
	int Get_Seq(char* s)
	{
		int len=strlen(s),now=1;
		s[len]='/';
		if (len==1) return 1;
		for (int l=1,r=1;r<len;l=r=(r+1))
		{
			while (r<len && s[r]!='/') r++;
			for (int i=l;i<=r;now=ch[now][d(s[i++])]) if (!ch[now][d(s[i])])
				fa[++cnt]=now,chi[cnt]=s[i],ch[now][d(s[i])]=cnt;
			length[now]=r-l;
			while (To[now]) now=To[now];
		}
		return now;
	}
	
	void ShortCut(char* s,char* t) {To[Get_Seq(s)]=Get_Seq(t);}
	
	void RealWay(char* s)
	{
		int sid=Get_Seq(s);
		int tot=0;
		if (sid==1) temp[tot++]='/';
		while (sid) temp[tot++]=chi[sid],sid=fa[sid];
		while (--tot) putchar(temp[tot]);
		putchar('n');
	}
}T;

char a[maxn],b[maxn];
int n,m;

int main()
{
	scanf("%d%d",&n,&m);
	while (n--) scanf("%s %s",a,b),T.ShortCut(a,b);
	while (m--) scanf("%s",a),T.RealWay(a);
	return 0;
}


最后

以上就是帅气小白菜为你收集整理的UOJ#13【UER#1】跳蚤OS的全部内容,希望文章能够帮你解决UOJ#13【UER#1】跳蚤OS所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部