Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 13752 Accepted Submission(s): 4919
#include <cstdio>
#include <cstring>
char s[50005][50];
struct Node{
Node* pt[26];
bool isEnd;
};
Node* root;
Node memory[100000];
int allo;
void trie_init()
{
memset(memory, 0, sizeof(memory));
allo = 0;
root = &memory[allo++];
}
void trie_insert(char str[])
{
Node *p = root;
for(int i = 0; str[i] != ‘\0‘; ++i){
int id = str[i]-‘a‘;
if(p->pt[id] == NULL){
p->pt[id] = &memory[allo++];
}
p = p->pt[id];
}
p->isEnd = true;
}
bool trie_find(char str[])
{
Node *p = root;
for(int i = 0; str[i] != ‘\0‘; ++i){
int id = str[i]-‘a‘;
if(p->pt[id] == NULL){
return false;
}
p = p->pt[id];
}
return p->isEnd;
}
void getans(char str[])
{
Node* p = root;
for(int i = 0; str[i] != ‘\0‘; ++i){
int id = str[i]-‘a‘;
if(p->pt[id] == NULL){
return;
}
else{
if(p->pt[id]->isEnd && str[i+1] != ‘\0‘){
bool ok = trie_find(str+i+1);
if(ok){
printf("%s\n", str);
return;
}
}
}
p = p->pt[id];
}
}
void solve(int n)
{
trie_init();
for(int i = 0; i < n; ++i){
trie_insert(s[i]);
}
for(int i = 0; i < n; ++i){
getans(s[i]);
}
}
int main()
{
int n = 0;
while(gets(s[n])){
++n;
}
solve(n);
return 0;
}
原文:http://www.cnblogs.com/inmoonlight/p/5921071.html