HDU 1247(Hat’s Words )
/*
Date: 2012/10/27
题目链接地址:http://acm.hdu.edu.cn/showproblem.php?pid=1247
思路:把字典中的每个字符串拆成0->j 和 j->n 两个子串,再分别查找这两个子串
在不在字典中,若在则满足题意
*/
方法1:字典树
#include<iostream> #include<string> using namespace std; #define maxn 50001 string s[maxn]; struct Trie { int n; Trie *next[26]; Trie() { n = 0; memset(next,0,sizeof(next)); } }; void Insert(Trie *root,string s) { Trie *p = root; for(int i = 0; i < s.size(); i++) { int j = s[i] - 'a'; if(p->next[j] == NULL) p->next[j] = new Trie(); p = p->next[j]; } p->n++; } bool Find(Trie *root,string s) { Trie *p = root; for(int i = 0; i < s.size(); i++) { int j = s[i] - 'a'; if(p->next[j] == NULL) return false; p = p->next[j]; } if(p->n > 0) return true; return false; } int main() { //freopen("1001.txt","r",stdin); int n = 0; Trie *root = new Trie(); while(cin >> s[n]) Insert(root,s[n++]); for(int i = 0; i < n; i++) for(int j = 1; j < s[i].size()- 1; j++) { string s1(s[i],0,j); //表示把s[i]中从下标0开始连续的j个字符赋给s1
string s2(s[i],j,s[i].size()-j); if(Find(root,s1) && Find(root,s2)) { cout << s[i] << endl; break; } } return 0; }
方法2:stl中的map
#include<iostream> #include<map> #include<string> using namespace std; string s[50001]; int main() { //freopen("1001.txt","r",stdin); int n = 0; map<string,int> m; while(cin >> s[n]) m[s[n++]] = 1; for(int i = 0; i < n; i++) for(int j = 1; j < s[i].size() - 1; j++) { string s1(s[i],0,j); ////表示把s[i]中从下标0开始连续的j个字符串赋给s1
string s2(s[i],j,s[i].size()-j); if(m[s1] == 1 && m[s2] == 1) { cout << s[i] << endl; break; } } return 0; }

浙公网安备 33010602011771号