标签:
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1247
题目大意:
一个"hat‘s word"是一个单词,可以恰好由字典中其他两个单词连接得到(比如字典中是hat‘s和word)。
给出字典中的单词,输出所有的hat‘s word。
思路:
建立字典树,将每个单词都插入到Trie树中,Count统计单词(不是前缀)出现次数。按顺序将每个单词
所有可能的长度拆分成前缀单词和后缀单词,判断这两部分是否都在字典树中,是就是hat‘s word,
进行输出,否则继续拆分当前单词或下一单词。
AC代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; struct TrieNode { int Count; struct TrieNode *Next[26]; }; TrieNode *root; char s[50010][110],s1[110],s2[110]; void Create() { root = new TrieNode; memset(root->Next,NULL,sizeof(root->Next)); root->Count = 0; } void Insert(char *s) { TrieNode *p, *q; p = root; while(*s) { if(p->Next[*s-'a'] == NULL) { q = new TrieNode; memset(q->Next,NULL,sizeof(q->Next)); q->Count = 0; p->Next[*s-'a'] = q; } p = p->Next[*s-'a']; s++; } p->Count++; } int Find(char *s) { TrieNode *p; p = root; while(*s) { if(p->Next[*s-'a'] == NULL) return 0; p = p->Next[*s-'a']; s++; } return p->Count; } int main() { int i = 0; Create(); while(cin >> s[i]) { Insert(s[i]); i++; } for(int k = 0; k < i; ++k) { for(int j = 1; j < strlen(s[k])-1; ++j) { for(int jj = 0; jj < j; ++jj) s1[jj] = s[k][jj]; s1[j] = '\0'; strcpy(s2,s[k]+j); if(Find(s1) && Find(s2)) { cout << s[k] << endl; break; } } } return 0; }
标签:
原文地址:http://blog.csdn.net/lianai911/article/details/45192971