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;
}