UOJ 13 [UER #1]跳蚤OS

原创 2016年08月30日 17:48:38

trie树。

在trie上建每一条路径的字符串。节点加一个go指针,如果go不为NULL则说明他是快捷方式,并且go指向它指向的文件夹。然后找一找,连一连,就好了。

其实我觉得如果对于每个文件夹,把名字哈希之后视为一个节点,依然可做。但是太懒不想打哈希。

#include<cstdio>
#include<cstring>
using namespace std;
char s[500005], t[500005];
struct node
{
    node *next[30], *go, *fa;
    int v;
    node(){fa=go=NULL;memset(next,NULL,sizeof(next));}
};
int pack(char c)
{
    if(c=='/')return 26;
    else return c-'a';
}
char unpack(int c)
{
    if(c==26)return '/';
    else return c+'a';
}
struct TRIE
{
    node *root;
    void init()
    {
        root= new node;
    }
    node* inser(char *s)
    {
        node *p=root;
        for(int i = 0; s[i]; i++)
        {
            int c=pack(s[i]);
            if(!p->next[c])
            {
                p->next[c]=new node;
                p->next[c]->fa=p;
                p->next[c]->v=c;
            }
            p=p->next[c];
            if(c==26 && p->go)
                p=p->go;
        }
        if(p->v!=26)
        {
            if(!p->next[26])
            {
                p->next[26]=new node;
                p->next[26]->fa=p;
                p->next[26]->v=26;
            }
            p=p->next[26];
            if(p->go)p=p->go;
        }
        return p;
    }   
}trie;
int main()
{
    int n, m;
    scanf("%d%d",&n,&m);
    trie.init();
    for(int i = 1; i <= n; i++)
    {
        scanf("%s%s",s,t);
        node *p=trie.inser(s);
        node *q=trie.inser(t);
        p->go=q;
    }
    for(int i = 1; i <= m; i++)
    {
        scanf("%s",s);
        node *p=trie.inser(s);
        if(p->fa!=trie.root)p=p->fa;
        int j=0;
        while(p!=trie.root)
        {
            t[j++]=unpack(p->v);
            p=p->fa;
        }
        for(int k = j-1; k >= 0; k--)
            printf("%c",t[k]);
        puts("");
    }
}
版权声明:本文为蒟蒻原创文章,应该没什么人会转载的,要转载就注明出处吧。

UOJ#13【UER#1】跳蚤OS

题目链接:http://uoj.ac/problem/13 【分析】     建一棵Trie树,然后基本上就是一个裸的Trie了,记录一下父亲节点和是否是快捷方式即可。 【代码】...

【UOJ 209】【UER #6】票数统计

Description 原题链接妹滋滋是一个善于编程的女孩子。但是某一天,她一不小心把 UOJ 后台的票数统计程序写错了。本来嘛在这种根本没有什么用的功能上出了 bug 也没有什么大关系,但是又有某一...
  • HOWARLI
  • HOWARLI
  • 2016年07月08日 12:09
  • 143

【UOJ 245】【UER #7】天路

Description 给出一个系列,要求出所有长度为k(1
  • HOWARLI
  • HOWARLI
  • 2016年10月26日 18:57
  • 463

【UOJ #209】【UER #6】票数统计

Description 妹滋滋是一个善于编程的女孩子。 但是某一天,她一不小心把 UOJ 后台的票数统计程序写错了。 本来嘛在这种根本没有什么用的功能上出了 bug 也没有什么大关系,但是又有某一...

UOJ 210 [UER #6]寻找罪犯

2-SAT首先2-SAT的tarjan做适用于一类如果A->B,则一定有B’->A’的对称的图。一个强联通分量里的所有点,要么一起选要么一起不选,那就缩起来。一个重要的结论是如果一个强联通分量里同时有...

[UOJ#245][UER#7B]天路

Description给出n个数,对于每个k(2

[UOJ#246][UER#7C]套路(数luan学gao相关)

人最可悲的是,有自由的思想,却没有冲破羁绊的勇气。

【构造+分治】【UER #5】UOJ143 万圣节的数列

UOJ143

UOJ210【UER #6】寻找罪犯 (2-SAT前后缀优化建边)

UOJ210【UER #6】寻找罪犯原题地址:http://uoj.ac/problem/210题意: n 个嫌疑人,编号为 1 到 n,严刑拷打之下,他们交代了一些供词,供词有两类: 1.xi ...
  • Bfk_zr
  • Bfk_zr
  • 2017年12月11日 09:45
  • 26

【UOJ 测试】C. 【#246 UER #7】套路(乱搞+枚举)

胭脂妆,残红落、悲歌凄凉断人肠
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UOJ 13 [UER #1]跳蚤OS
举报原因:
原因补充:

(最多只允许输入30个字)