PS: Trie树的应用。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> using namespace std; const int maxn = 50010; const int MAX = 200; //2014-04-05 Accepted 1247 15MS 7368K 2121 B C++ Achiberx struct node { int v; node* next[26]; }; node* root; int cnt[MAX]; void Insert(char* str) { node* now = root; int len = strlen(str); for(int i = 0; i < len; i++) { int u = str[i]-‘a‘; if(now->next[u]==NULL) { node* t = new node; t->v = 0; memset(t->next, NULL, sizeof(t->next)); now->next[u] = t; } now = now->next[u]; } now->v = -1; // represent the ending of word. } bool query2(char* str) { node* now = root; int len = strlen(str); for(int i = 0; i < len; i++) { int u = str[i]-‘a‘; if(now->next[u] != NULL) { now = now->next[u]; if(i==len-1 && now->v ==- 1) return true; } else return false; } return false; } bool query(char* str) { vector<int> v; v.clear(); node* now = root; int len = strlen(str); for(int i = 0; i < len; i++) { int u = str[i]-‘a‘; if(now->next[u] != NULL) { now = now->next[u]; if(now->v==-1) { v.push_back(i); } } else break; } if(!v.size()) return false; char remain[100]; memset(remain, ‘\0‘, sizeof(remain)); for(int i = 0; i < (int)v.size(); i++) { int st = v[i]; strcpy(remain, str+st+1); if(!strlen(remain)) return false; bool result = query2(remain); if(result) return true; else continue; } return false; } char lib[maxn+5][100]; int main() { char str[100]; int idx = 0; root = new node; root->v = 0; memset(root->next, NULL, sizeof(root->next)); while(gets(str) && str[0]) { Insert(str); strcpy(lib[idx++], str); } for(int i = 0; i < idx; i++) { bool res = query(lib[i]); if(res) puts(lib[i]); } return 0; }
HDU1247 Hat’s Words,布布扣,bubuko.com
原文:http://blog.csdn.net/achiberx/article/details/22984935