网易:下厨房

题目链接: 下厨房

第一种做法:

用STL做。不过不能老依赖STL,还是因该老老实实地用字典树,字典树模板题。

#include<iostream>
#include<algorithm>
#include<set>
using namespace std;
//greedy is good.
int main()
{
    string str;
    set<string> s;
    while(cin>>str)
    {
        s.insert(str);
    }
    cout<<s.size()<<endl;
    return 0;
}

第二种做法:

字典树模板题,只需要稍微修改插入就行。

#include<iostream>
#include<algorithm>
#include<cstring> 
using namespace std;
int cnt=0;
const int maxn =2e6+5;	//如果是64MB可以开到2e6+5,尽量开大 
int tree[maxn][30];		//tree[i][j]表示节点i的第j个儿子的节点编号 
bool flagg[maxn];		//表示以该节点结尾是一个单词 
int tot;				//总节点数 
void insert_(char *str) 
{
	 int len=strlen(str); 
	 int root=0; 
	 for(int i=0;i<len;i++) 
	 { 
	 	int id=str[i]-'0'; 
		if(!tree[root][id]) 
			tree[root][id]=++tot; 
			root=tree[root][id]; 
	 } 
	 if(flagg[root]) cnt++;	//cnt为重复出现的次数 
	 flagg[root]=true;
}
int main()
{
	char str[100];
	int T=0;
	while(~scanf("%s",str))
	{
		insert_(str);
		T++;				//T为单词总量 
	}	
	cout<<T-cnt<<endl;		 
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/q1122333/article/details/82833988