标签:字典树
分析:一开始是用递归做的,没做出来,于是就换了现在的数组。即,把每一个输入的字符串都存入二维数组中,然后创建字典树。输入和创建完毕后,开始查找。
其实一开始就读错题目了,题目要求字符串是由其他两个输入的字符串组成的前后缀,自己根本没有判断前缀是否满足,就直接判断后缀,一直想不通自己哪里错了,很惭愧,水平还是不行。
查找分为前缀查找和后缀查找,其实两个函数基本差不多的。下面放代码。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
struct trie
{
trie *next[26];
int v; //字符相同的个数
trie()
{
memset(next,NULL,sizeof(next));
v=1;
}
};
trie *root=new trie();
char s[50001][101];
void creat_trie(char *str)
{
int i,id;
trie *p;
for(p = root,i=0;str[i]; ++i)
{
id = str[i]-'a';
if(p->next[id] == NULL)
{
p->next[id] = new trie();
}
p = p->next[id];
}
p->v = -1;
}
int find_trie(char *str)
{
int i=0,j,id;
trie *p = root;
for(;*str != '\0';)
{
id= *str - 'a' ;
if (p->next[id] != NULL)
{
p = p->next[id];
if(p->v == -1 && *(str+1) == '\0')
return 1;
str++;
}
else
return 0;
}
return 0;
}
int find(char *str)
{
trie *p = root;
int m;
for (;*str != '\0';)
{
m = *str - 'a';
p = p->next[m];
if(p != NULL)
{
if (p->v == -1 && find_trie(str+1))
{
return 1;
}
str++;
}
else
return 0;
}
return 0;
}
int main()
{
int N,n,i=0,j,t,m,flag=0;
int a,b,c,d,k;
int sum;
trie *p;
while (gets(s[i]),s[i][0] != '\0')//,s[i][0] != '\0'
{
creat_trie(s[i++]);
}
for (j=0;j<i;j++)
{
if (find(s[j]))
{
puts(s[j]);
}
}
return 0;
}
a ahat hat hatword hziee word
ahat hatword
标签:字典树
原文地址:http://blog.csdn.net/xinwen1995/article/details/46402085