分析:一开始是用递归做的,没做出来,于是就换了现在的数组。即,把每一个输入的字符串都存入二维数组中,然后创建字典树。输入和创建完毕后,开始查找。
其实一开始就读错题目了,题目要求字符串是由其他两个输入的字符串组成的前后缀,自己根本没有判断前缀是否满足,就直接判断后缀,一直想不通自己哪里错了,很惭愧,水平还是不行。
查找分为前缀查找和后缀查找,其实两个函数基本差不多的。下面放代码。
#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