【hdu1247】Hat’s Words

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

Author

戴帽子的

题解

题目意思:给一堆串,判断哪个串可以又这堆串里的两个串相连得到

trie树。把串先读进去,然后枚举每种可能判断一下。

s.substr (i,j) 串s 从i开始截取j位

next要开27个。(0里边是空的)

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
struct node
{
    int next[27];
    int w;
}t[50010];
string ss[50010];
string s;
int topt,cnt;
void add_trie()
{
    int l=s.length(),now = 0;
    for (int i=0;i<l;i++)
    {
        int x = s[i]-‘a‘+1;
        if (t[now].next[x])
            now = t[now].next[x];
        else
        {
            t[now].next[x] = ++topt;
            now = topt;
        }
    }
    t[now].w=1;
}
int find()
{
    int l=s.length(),now = 0,p = 0;
    while (p<l)
    {
        if (!t[now].next[s[p]-‘a‘+1]) return 0;
        else
        {
            now = t[now].next[s[p]-‘a‘+1];
            p++;
        }
    }
    if (t[now].w) return 1;
        else return 0;
}
int main()
{
    while (cin>>ss[++cnt])
    {
        s = ss[cnt];
        add_trie();
    }
    for (int i=1;i<cnt;i++)
    {
        string s3=ss[i];
        int l=s3.length();
        for (int j=1;j<l;j++)
        {
            s=s3.substr(0,j);
            if (find())
            {
                s = s3.substr(j,l);
                if (find())
                {
                    cout<<s3<<endl;
                    break;
                }
            }
        }
    }
}
时间: 2024-08-09 10:38:15

【hdu1247】Hat’s Words的相关文章

hdoj 1250 Hat&#39;s Fibonacci 【高精度】

Fibonacci... 策略:用Java 做这道题较简单一些,但是,C语言是基础. 用java的话,就是最简单的BigInteger的使用. 下面简单讲一下C语言的做法: 一个12位的整数,可以表示为,3个四位的整数的集合,例如123412341234就可以转化为1234, 1234, 1234.下面的就是按照此原理做的. c代码: #include <stdio.h>//每一个int都代表6个数. #include <string.h> #define M 10000 int

【HDOJ】1247 Hat’s Words

字典树. 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 5 #define MAXN 50005 6 #define MAXL 25 7 8 typedef struct Trie { 9 bool f; 10 Trie *next[26]; 11 Trie() { 12 f = false; 13 for (int i=0; i<26; ++i) 14 next[i] = NULL

【VNC】Linux环境VNC服务安装、配置与使用

[VNC]Linux环境VNC服务安装.配置与使用 2009-06-25 15:55:31 分类: Linux 前言:作为一名DBA,在创建Oracle数据库的过程中一般要使用dbca和netca图像化进行建库和创建监听(如果使用脚本建库另说),如果您身体好估计可以在瑟瑟发抖的机房中完成数据库的创建过程,由于本人对寒冷比较敏感,又不想通过这样的方式锻炼身体,所以更愿意在舒适的房间内一边品味着咖啡的浓香,顺便度过相对枯燥的数据库安装和配置的过程,So,图形化操作工具是必不可少的,在Linux操作系

【集合论】 03 - 序集和序数

1. 势 在上一篇我提过自然数“量”和“序”的双重性质,如果再仔细斟酌,“量”其实是由“序”产生和决定的,把有限的元素按某个顺序排列起来,正是我们确定其数量的过程.那么对于无穷集,“量”和“序”还有这样的关系吗?无穷集的“量”和“序”又该如何定义呢?既然它们产生于自然数,那么答案自然就在自然数的扩展中.对于有限集的量\(n\),可以看作是有限集的元素与\(n\)的元素的一一对应.这个直观的方法同样适用于无穷集,如果能找到一个标尺,将无穷集的元素和标尺的元素一一对应,那就能得到无穷集的“量”. 暂

Linux必学的60个命令【转载】

Linux提供了大量的命令,利用它可以有效地完成大量的工 作,如磁盘操作.文件存  [转载地址]http://blog.chinaunix.net/uid-16728139-id-3154272.html 自己留着,用得着. Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作.文件存取.目录操作.进程管理.文件权限设定等.所以,在Linux系统上工作离不开使用系统提供的命令.要想真正理解Linux系统,就必须从Linux命令学起,通过基础的命令学习可以进一步理解Linux系统

【转】Ubuntu下deb包的安装方法

[转]Ubuntu下deb包的安装方法 deb是debian linus的安装格式,跟red hat的rpm非常相似,最基本的安装命令是:dpkg -i file.deb dpkg 是Debian Package的简写,是为Debian 专门开发的套件管理系统,方便软件的安装.更新及移除.所有源自Debian的Linux发行版都使用dpkg,例如Ubuntu.Knoppix 等.以下是一些 Dpkg 的普通用法: 1.dpkg -i <package.deb>安装一个 Debian 软件包,如

【转】对于杭电OJ题目的分类

[好像博客园不能直接转载,所以我复制过来了..] 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze 广度搜索1006 Redraiment猜想 数论:容斥定理1007 童年生活二三事 递推题1008 University 简单hash1009 目标柏林 简单模拟题1010 Rails 模拟题(堆栈)1011 Box of Bricks 简单题1012 IMMEDI

【HA】RHCS + IB + ISCSI+ext4/gfs2

封装虚拟机BASE(母机): 1. 删除自启动项 /etc/udev/rules.d/70-persistent-net.rules  这样网络设备就为eth0,而不是eth1 2. 更改网络配置文件  vi /etc/sysconfig/selinux   设置为不启用 3. 禁止网络功能    chkconfig iptables off    3.1 网络启动方式:/etc/init.d/iptavlesstop|start|restart                      ser

【学神】1-6软件包安装

所讲内容: rpm软件包管理 yum安装软件包 源码编译安装软件包 安装srpm软件包 一. rpm软件包管理 1.什么是rpm rpm是RPM Package Manager(RPM软件包管理器)的缩写,一种用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中,它生成具有.RPM扩展名的文件,现在包括OpenLinux.S.u.S.E.以及Turbo Linux等Linux的分发版本都有采用. 2.rpm的主要功能 安装.卸载.升级和管理软件 组件查询功能 验证功能 软件包GPG和