• Hats’Worlds(字典树)


    Hats’World

    Problem Description:
    A hat’s word is a word in the dictionary that is the concatenation of exactly two other words in the dictionary.
    You are to find all the hat’s words in a dictionary.
    Input:
    Standard input consists of a number of lowercase words, one per line, in alphabetical order. There will be no more than 50,000 words.
    Only one case.
    Output:
    Your output should contain all the hat’s words, one per line, in alphabetical order.
    Sample Input:
    a
    ahat
    hat
    hatword
    hziee
    word
    Sample Output:
    ahat
    hatword
    题目大意:
    给定一组单词,让你找到一个单词,使得这个单词由这组单词中出现过的两个单词构成。
    例:ahat由a和hat构成,而a和hat在这组单词中出现过。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int maxn=50010;
    struct node
    {
        int next[27];
        int b;
    }tree[maxn];
    int tot=1,sum,top,stack[maxn];
    char s[maxn][27];
    void build_tree(int l,char s[])
    {
        int now=0;
        for(int i=0;i<l;i++)
        {
            int x=s[i]-96;
            if(tree[now].next[x])
            now=tree[now].next[x];
            else
            {
                tree[now].next[x]=++sum;
                now=sum;
            }
        }
        tree[now].b=true;
    }
    int can(int l,char s[])
    {
        int i=0,now=0,top=0;
        for(int i=0;i<l;i++)
        {
            int x=s[i]-96;
            if(tree[now].next[x])
            now=tree[now].next[x];
            else return 0;
            if(tree[now].b&&s[i])
            stack[top++]=i+1;
        }
        while(top)
        {
            int now=0;
            bool flag=1;
            int x=stack[--top];
            while(s[x])
            {
                if(!tree[now].next[s[x]-96])
                {
                    flag=0;
                    break;
                }
                now=tree[now].next[s[x]-96];
                x++;
            }
            if(flag&&tree[now].b)
            return 1;
        }
        return 0;
    }
    int main()
    {
        while(gets(s[tot])&&strlen(s[tot]))
        {
            int len=strlen(s[tot]);
            build_tree(len,s[tot]);
            tot++;
        }
        for(int i=1;i<=tot;i++)
        {
            int len=strlen(s[i]);
            if(can(len,s[i]))
            cout<<s[i]<<endl;
        }
        return 0;
    }
  • 相关阅读:
    Django(25)WSGIRequest对象
    Django(24)永久重定向和临时重定向
    Django(23)Django限制请求装饰器
    Django(22)Django执行SQL语句
    Django(21)migrate报错的解决方案
    Django(20)ORM模型迁移命令
    Django(19)QuerySet API
    Django(18)聚合函数
    Django(17)orm查询操作
    数据结构-用队列实现栈
  • 原文地址:https://www.cnblogs.com/cax1165/p/6070995.html
Copyright © 2020-2023  润新知