题目链接:hdu1247
/* 大意: 如果两个单词组成的单词存在,则输出组合后的单词 思路:字典树 在查找时,将一个单词分成两部分,看这两部分是否存在 */ #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #include <map> #include <cstdlib> using namespace std; struct node { bool flag; node *next[26]; }*root; node *build() { node *p = (node *)malloc(sizeof(node)); for(int i = 0; i < 26; i ++) p -> next[i] = NULL; p -> flag = false; return p; } void save(char *s) { node *p; p = root; int len = strlen(s); for(int i = 0; i < len; i ++) { if(p -> next[s[i] - ‘a‘] == NULL) p -> next[s[i] - ‘a‘] = build(); p = p -> next[s[i] - ‘a‘]; } p -> flag = true; } int query(char *s) { node *p; p = root; int len = strlen(s); for(int i = 0; i < len; i ++) { if(p -> next[s[i]- ‘a‘] == NULL) return 0; p = p -> next[s[i] - ‘a‘]; } if(p -> flag) return 1; else return 0; } int main() { root = build(); char str[50005][20]; int n = 0; while(~scanf("%s",str[n])) { save(str[n]); n ++; } for(int i = 0; i < n; i ++) { char a[20],b[20]; int len = strlen(str[i]); for(int j = 0; j < len; j ++) { memset(a, ‘\0‘, sizeof(a)); memset(b, ‘\0‘, sizeof(b)); strncpy(a, str[i], j);//单词前半部 strncpy(b, str[i] + j, len - j);//单词后半部 if(query(a) && query(b)) { printf("%s\n",str[i]); break; } } } return 0; }
原文:http://blog.csdn.net/jzmzy/article/details/19421515