题意 给你一个字典 输出字典中能表示成两个单词连接的所有单词
最基础的字典树应用 先把所有单词加入字典树中 标记每个结点是否为某个单词的结尾 然后查找每个单词 在树上查询过程中遇到单词结尾时 如果剩下的后缀也是一个单词 那当前查询的单词就可以是两个单词的连接了
#include <cstdio> #include <cstring> using namespace std; const int N = 50005; int n; char ss[N][20]; struct Trie { Trie *chi[26]; bool isEnd; Trie() { isEnd = false; memset(chi, NULL, sizeof(chi)); } }*root; void insertTrie(Trie *r, char s[]) { int i = 0, j; while(s[i]) { j = s[i++] - 'a'; if(r->chi[j] == NULL) r->chi[j] = new Trie(); r = r->chi[j]; } r->isEnd = true; } //op标记这次查询是查询后缀还是查询整个 bool searchTrie(Trie *r, char s[], int op) { int i = 0, j; while(s[i]) { j = s[i++] - 'a'; if(r->chi[j] == NULL) return false; r = r->chi[j]; if(!op && r->isEnd && s[i])//前缀是一个单词 { if(searchTrie(root, s + i, 1)) return true; //查询后缀是否是一个单词 } } return op ? r->isEnd : op; } int main() { int m = 0; root = new Trie(); while(~scanf("%s", ss[m])) insertTrie(root, ss[m++]); for(int i = 0; i < m; ++i) if(searchTrie(root, ss[i], 0)) puts(ss[i]); return 0; }
a ahat hat hatword hziee word
ahat hatword
版权声明:本文为博主原创文章,未经博主允许不得转载。
HDU 1247 Hat’s Words (字典树·Trie)
原文地址:http://blog.csdn.net/acvay/article/details/47086977