hdu1247

一道水题,居然改错改了一个多小时

题目的意思是其实就是找出一个单词,前半部是一个出现过的单词,后半部也是,记住,要严格满足这个条件

所以,其实也就是先查找一个单词的是否有前缀,再用这个单词除去前缀的部分查找是否存在一个这样的单词

虽然题目说按字典序输出,但本身已经是按字典序输入了,所以排序也就省了

#include<iostream>
#include<string>
using namespace std;
struct node
{
	int v;
	node *next[26];
};
node *root;
char str[50002][50];
void insert(char *s)
{
	node *p=root;
	for(;*s!='\0';s++)
	{
		int d=*s-'a';
		if(p->next[d]==NULL)
		{
			p->next[d]=new node();
			p=p->next[d];
		}
		else p=p->next[d];
	}
//	cout<<p->v<<endl;
	p->v=1;
}
int find2(char *s)
{
	node *p=root;
	for(;*s!='\0';)
	{
		int d=*s-'a';
		if(p->next[d]!=NULL)
		{
	    	p=p->next[d];
		    if(p->v==1&&*(s+1)=='\0')//这部分很关键,要严格满足
			  return 1;
			s++;//这里也是,即使上一步没找到,还得继续往下查找
		}
		else return 0;
	}
	return 0;
}
int find(char *s)
{
	node *p=root;
	for(;*s!='\0';)
	{
		int d=*s-'a';
		p=p->next[d];
		if(p!=NULL)
		{ 
		if(p->v==1&&find2(s+1))//用除去前缀剩下的部分在find2中查找
		    	return 1;
		s++;
		}
		else return 0;
	}
	return 0;
}

int main()
{
	int i=0,j;
	root=new node();
	while(scanf("%s",str[i])!=EOF)
	{
	   insert(str[i]);
	   i++;
	}
	for(j=0;j<i;j++)
	{
		
		if(find(str[j]))
		{ 
			cout<<str[j]<<endl;;
		}
	}
	return 0;
}
原文地址:https://www.cnblogs.com/nanke/p/2046869.html