字典树。关于字典树,这个博客把这道题讲的很好。点击打开链接
这里这个图很好
#include<cstdio>
#include<cstring>
const int maxn = 50000 + 5;
char words[maxn][100];
struct node
{
bool is;
node *nex[27];
node()
{
is = false;
memset(nex, 0, sizeof(nex));
}
};
void build_tree(char *str, node *rt)
{
int len = strlen(str);
node *p = rt;
for(int i = 0; i < len; i++)
{
int pos = str[i] - 'a';
if(p->nex[pos] == NULL)
{
p->nex[pos] = new node();
}
p = p->nex[pos];
}
p->is = true;
}
int search_str(char *str, node *rt)
{
int top = 0;
node *p = rt;
int Stack[100];
int len = strlen(str);
for(int i = 0; i < len; i++)
{
int pos = str[i] - 'a';
if(p->nex[pos] != NULL)
p = p->nex[pos];
if(p->is == true)
Stack[++top] = i;
}
while(top >= 1)
{
p = rt;
int pos = Stack[top--];
int flag = true;
for(int i = pos + 1; i < len; i++)
{
int t = str[i] - 'a';
if(p->nex[t] != NULL)
p = p->nex[t];
else {flag = false; break;}
}
if(p->is == true && flag) return true;
}
return false;
}
int main()
{
//ofstream fout ("test.out");
//ifstream fin ("test.in");
node *rt = new node();
int cnt = 0;
while(scanf("%s", words[cnt]) == 1)
{
build_tree(words[cnt], rt);
cnt++;
}
for(int i = 0; i < cnt; i++)
{
if(search_str(words[i], rt))
{
printf("%s\n", words[i]);
}
}
return 0;
}