HDU1247 Hat’s Words【Trie】

来源:互联网 发布:scratch趣味编程100例 编辑:程序博客网 时间:2024/06/06 11:06

题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=1247

思路

叫你在字典中找一些字符串,约束条件:可以拆分成两个已有的字符串
直接暴力肯定超时,所以把所有的词都放在字典树里咨询就可以了。
不过这样复杂度还是有点高,但是竟然能过,看来这题数据还是比较小的。

AC代码

#include <iostream>#include <string>using namespace std;struct Trie{    Trie()    {        for (int i = 0; i < 26; ++i)        {            next[i] = nullptr;        }        is_end = false;    }    bool is_end;    Trie* next[26];}root;void insert(string s){    Trie *now = &root;    for (int i = 0; i < s.length(); ++i)    {        if (now->next[s[i] - 'a'] == nullptr) now->next[s[i] - 'a'] = new Trie;        now = now->next[s[i] - 'a'];        if (i == s.length() - 1) now->is_end = true;    }}bool find(string s){    Trie *now = &root;    for (int i = 0; i < s.length(); ++i)    {        now = now->next[s[i] - 'a'];        if (now == nullptr) return false;        if (i == s.length() - 1) return now->is_end;    }    return false;}string dic[50000 + 10];int main(){    cin.tie(0); ios::sync_with_stdio(false);    string s;    int p = 0;    while (cin >> s)    {        insert(s);        dic[p++] = s;    }    for (int i = 0; i < p; ++i)    {        for (int r = 1; r <= dic[i].length() - 1; ++r)        {            string a = dic[i].substr(0, r);            string b = dic[i].substr(r, dic[i].length() - r);            if (find(a) && find(b))            {                cout << dic[i] << "\n";                break;            }        }    }    return 0;}
0 0
原创粉丝点击