Hat’s Words

/* 很水的字典樹題 */ 點擊打開鏈接

#include < iostream >
#include < cstdio   >
#include < string   >
#include <   map    >
#include < cstring  >
#define    N   500000 
#define    M   26
using namespace  std;
int n;
char  s[N][100];
struct node
{
	int f;
	node *next[M];
	node()
	{
		f=0;
		for(int i=0 ; i<M ; i++ )
		next[i]=NULL ;
	}
}*Root;
map <string,int> ma;
map <string,int>::iterator it;
void insert(char s[])
{
	int i;
	node *r=Root;
	int len=strlen(s);
	for(i=0;i<len;i++)
	{
		if(!(r->next[s[i]-'a']))
			r->next[s[i]-'a']=new node();
		r=r->next[s[i]-'a'];
	}
	r->f=1;
}
int search(char s[],int len)
{
	int i;
	node *r=Root;
	for(i=0 ; i<len ; i++)
	{
		if(!(r->next[s[i]-'a'])) return 0;
		r=r->next[s[i]-'a'];
	}
	if(r->f==1) return 1;
	else        return 0;
}
int main ()
{
	//freopen("zds.txt","r",stdin);
	n=0;
	ma.clear();
	int i,j,k,l;
	char p[100],q[100];	
	Root = new node();
	while(scanf("%s",s[n++])!=EOF)
	{
		insert(s[n-1]);
	}
	for(i=0 ; i<n ; i++)
	{
		l=strlen(s[i]);
		if(l>1)
		{
			for(j=0;j<l-1;j++)
			{
				int nt=0,mt=0;
				memset(q,'\0',sizeof(q));
				memset(p,'\0',sizeof(p));
				for(k=0 ; k<=j ; k++) p[nt++]=s[i][k];
				for(k=j+1 ; k<l ;k++) q[mt++]=s[i][k];
				if(search(p,nt) && search(q,mt))
				{
					string th="";
					for(j=0;j<l;j++) th+=s[i][j];
					ma[th]=1;
					break;
				}
			}
		}
	}
	for(it=ma.begin();it!=ma.end();it++)
		cout<<it->first<<endl;
	return 0;
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章