HDU 1247 Hat’s Words (Trie)

本文介绍了一种利用前缀树(Trie树)进行高效字符串匹配的方法,通过枚举每个单词的所有可能分割点来判断该单词是否可以由两个已存在的单词组成。文章提供了完整的C++实现代码,并总结了实现过程中需要注意的一些细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:给你n个单词(n<=5e4),让你找出能由其他两个单词拼成的单词。


思路:对于每个单词去枚举分割点,找一下拆成的两个单词是否都存在即可。


这题坑点比较多:

1.读入时不能用gets()!=NULL, 要用scanf()!=EOF

2.找到正确的分割点输出单词后记得要break,否则可能多次输出。

3.自己想简单了,Match时不是光val==1就行了,忘记考虑ch[][]不存在时也要返回false。


代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxnode = 50000*27+5;
int ch[maxnode][27], val[maxnode], sz;
char str[50005][27];

void init()
{
    sz = 1;
    memset(ch[0], 0, sizeof(ch[0]));
}

void Insert(char *s)
{
    int u = 0;
    int len = strlen(s);
    for(int i = 0; i < len; i++)
    {
        if(ch[u][s[i]-'a'] == 0)
        {
            memset(ch[sz], 0, sizeof(ch[sz]));
            val[sz] = 0;
            ch[u][s[i]-'a'] = sz++;
        }
        u = ch[u][s[i]-'a'];
    }
    val[u] = 1;
}

bool Match(char *s)
{
    int u = 0;
    int len = strlen(s);
    for(int i = 0; i < len; i++)
    {
        if(ch[u][s[i]-'a'] == 0) return 0;
        u = ch[u][s[i]-'a'];
    }
    return val[u]==1;
}

int main(void)
{
    int cnt = 0;
    init();
    while(scanf("%s",str[cnt])!=EOF)
    {
        Insert(str[cnt]);
        cnt++;
    }
    for(int i = 0; i < cnt; i++)
    {
        int len = strlen(str[i]);
        for(int k = 0; k < len-1; k++)
        {
            char str1[27], str2[27];
            for(int j = 0; j <= k; j++)
                str1[j] = str[i][j];
            str1[k+1] = 0;
            for(int j = k+1; j < len; j++)
                str2[j-k-1] = str[i][j];
            str2[len-k-1] = 0;
            if(Match(str1) && Match(str2))
            {
                puts(str[i]);
                break;
            }
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值