题目链接: 下厨房
第一种做法:
用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;
}