关闭

UOJ 13 [UER #1]跳蚤OS

标签: UOJ-13
63人阅读 评论(0) 收藏 举报
分类:

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("");
    }
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:35034次
    • 积分:3293
    • 等级:
    • 排名:第10275名
    • 原创:307篇
    • 转载:0篇
    • 译文:0篇
    • 评论:22条
    公告
    欢迎您 !
    由于博主是一个蒟蒻,
    如有错误之处还望指出!
    o( =•ω•= )o
    鸡汤
    ❤不要轻易否定自己,不要轻易放弃。
    ❤上天撒下一缕光明,我便不应安逸于黑暗之中。
    ❤不到万不得已,为什么要放弃。
    神犇们的博客
    文章分类