HDU 1247 Hat’s Words // Trie, 枚举
2015-10-25 23:42
513 查看
题目描述
HDU 1247 Hat’s Words解题思路
题目大意:判断一个单词是否能由字典中其它两个单词组合而成。
枚举每个单词所有的组合,然后查找分解出来的两个单词是否都存在于字典中即可。
参考代码
//********************************************** // Author: @xmzyt1996 // Date: 2015-10-15 // Name: HDU 1247.cpp //********************************************** #include <cstdio> #include <cmath> #include <cctype> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> #include <string> #include <bitset> #include <vector> #include <stack> #include <queue> #include <map> #define clr(a, b) memset(a, b, sizeof(a)) using namespace std; const int MAX_N = 50010; const int MAX_V = 110; struct Trie { Trie* next[26]; int flag; }node[MAX_N<<5]; int num; void init() { num = 0; memset(node, 0, sizeof(node)); } int getid(char c) { return c - 'a'; } void insert(char* s) { Trie* head = &node[0]; while (*s) { int id = getid(*s++); if ((head->next[id]) == NULL) head->next[id] = &node[++num]; head = head->next[id]; } head->flag = 1; } bool search(char* s) { Trie* head = &node[0]; while (*s) { int id = getid(*s++); if ((head->next[id]) == NULL) return false; head = head->next[id]; } return head->flag; } char word[MAX_N][MAX_V], s1[MAX_V], s2[MAX_V]; int main() { int k = 0; while (~scanf("%s", word[k])) insert(word[k++]); for (int i = 0; i < k; ++i) { int len = strlen(word[i]); for (int j = 1; j < len; ++j) { // 枚举每个单词所有的组合 clr(s1, 0); clr(s2, 0); strncpy(s1, &word[i][0], j); // 前半段 strncpy(s2, &word[i][j], len-j); // 后半段 if(search(s1) && search(s2)) { // 若分解的两个单词都存在,则满足 puts(word[i]); break; } } } return 0; }
相关文章推荐
- 全球唯一标识(转载)
- 无源码调试dex
- Android学习——定时执行,线程,线程池
- 动态规划之最长公共子序列(LCS)
- cocos2d-js如何在android平台上使用js直接调用Java方法
- 访问者模式
- ajax跨域
- 初学c课程笔记整理8-->>指针、结构体、枚举
- Obfuscator-LLVM各系统环境配置
- 快速排序和归并排序(C语言)
- lintcode 中等题:N Queens II N皇后问题 II
- Android中获取地理位置经纬度
- 搭建Django框架
- iOS条码的生成
- [Cocoa]_[配置gtest环境]
- IOS开发之UI介绍
- Windows XP硬盘安装Ubuntu 12.04双系统图文详解
- 详细学习线性布局(2)
- codeforces #38E
- Javascript 命名空间怎么个写法