hdu1247

字典树 VS  STL

本是字典树问题,但用容器巧妙解决了...  所以说容器真是个好东西。。。

Problem Description
A hat’s word is a word in the dictionary that is the concatenation of exactly two other words in the dictionary.
You are to find all the hat’s words in a dictionary.
 
Input
Standard input consists of a number of lowercase words, one per line, in alphabetical order. There will be no more than 50,000 words.
Only one case.  
Output
Your output should contain all the hat’s words, one per line, in alphabetical order.  
Sample Input
   
   
   
   
a ahat hat hatword hziee word

Sample Output
   
   
   
   
ahat hatword
法1:容器哈希:
#include<iostream>
#include<map>
#include<string>
#include<vector>
using namespace std;
int main()
{
	map<string , int> mm;

	vector<string > vec;
	char str[1000];
	int i,j,k;
	while(scanf("%s",str)!=EOF)
	{
		vec.push_back(string(str));
			mm[string (str)]++;
	}


	for(j=0;j<vec.size();j++)
	{
		string k=vec[j];

		if(k.size()>=2)
		{
			string a="",b="";

			for(i=0;i+1<k.size();i++)
			{
				a+=k[i];
				b=k.substr(i+1);
				if(mm[a]&&mm[b])
				{
					cout<<k<<endl;
					break;
				}

			}

		}
	}



	return 0;

}

法2:map string
#include <iostream>
#include <string>
#include <map>
using namespace std;
map < string , int > mp;
string str[50005];
int main ()
{
    int n = 0;
    while ( cin >> str[n] ) mp[ str[n++] ] = 1;
    for ( int i = 0; i < n; ++ i )
    {
          unsigned len = str[i].size ();
          for ( unsigned j = 1; j < len; ++ j )
          {
               string s1 ( str[i], 0, j );
               string s2 ( str[i], j );
               if ( mp[s1] == 1 && mp[s2] == 1 )
               {
                    cout << str[i] << endl; 
                    break;
               }
          } 
    }
    return 0;
}



法3:
字典树
/*hdu 1247 Hat's word 字典树 2011.10.16*/ 
#include <iostream>
#include<cstring>
#define MAX 26
using namespace std;

typedef struct Trie_Node
{
	bool isWord;
	struct Trie_Node *next[MAX];
}Trie;

char s[50000][50];

void insert(Trie *root,char *word)      
{
	Trie *p=root;
	while(*word!='\0')
	{
		if(p->next[*word-'a']==NULL)
		{
			Trie *temp=(Trie *)malloc(sizeof(Trie));
			for(int i=0;i<MAX;i++)
			{
				temp->next[i]=NULL;
			}
			temp->isWord=false;
			p->next[*word-'a']=temp;
		}
		p=p->next[*word-'a'];
		word++;
	}
	p->isWord=true;
}

bool search(Trie *root,char *word)         //查找单词是否存在 
{
	Trie *p=root;
	for(int i=0;word[i]!='\0';i++)
	{
		if(p==NULL||p->next[word[i]-'a']==NULL)
			return false;
		p=p->next[word[i]-'a'];
	}
	return p->isWord;
}

void del(Trie *root)                    //释放空间 
{
	for(int i=0;i<MAX;i++)
	{
		if(root->next[i]!=NULL)
		{
			del(root->next[i]);
		}
	}
	free(root);
}


int main(int argc, char *argv[])
{
	int i,j;
	int count=0;
	char str[50];
	Trie *root=(Trie *)malloc(sizeof(Trie));
	for(i=0;i<MAX;i++)
	{
		root->next[i]=NULL;
	}
	root->isWord=false;
	while(scanf("%s",str)!=EOF)
	{	
		strcpy(s[count++],str);
		insert(root,str);	
	}
	for(i=0;i<count;i++)
	{	
		for(j=1;j<=strlen(s[i])-1;j++)	
		{
			char temp1[50]={'\0'};
			char temp2[50]={'\0'};
			strncpy(temp1,s[i],j);     
			strncpy(temp2,s[i]+j,strlen(s[i])-j);
			if(search(root,temp1)&&search(root,temp2))
			{
				printf("%s\n",s[i]);
				break;                       
			}
		}
	}
	del(root);
	return 0;
}




你可能感兴趣的:(String,null,search,Dictionary,concatenation)