Trie树专题,就不用MAP写了。一开始WA了几次,是因为”asdf as a“这种情况处理错了,一个单词插入完毕后,要判断最后一个字母所在位置是否为已经存在的单词的结尾。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <iostream>
#define MAXN 26
using namespace std;
typedef struct Trie
{
int next[MAXN];
int cnt;
bool tail;
};
int tot;
Trie f[280000];
void TrieInit()
{
int i;
tot=MAXN;
memset(f,0,sizeof(f));
for(i=0;i<MAXN;i++) f[0].next[i]=i+1;
}
int Insert(string s)
{
int i,j,k,l,flag;
l=s.length();
flag=0; k=0;
for(i=0;i<l;i++)
{
if(f[k].next[s[i]-'a']!=0)
{
k=f[k].next[s[i]-'a'];
if(i==l-1)
{
if(f[k].tail==0) flag=1;
f[k].tail=1;
}
f[k].cnt++;
}
else
{
tot++;
f[k].next[s[i]-'a']=tot;
k=tot;
if(i==l-1)
{
flag=1;
f[k].tail=1;
}
f[k].cnt++;
}
}
return flag;
}
int main()
{
int i,j,k,t,m,n,ans;
string s;
while(getline(cin,s)&&s!="#")
{
string str;
TrieInit();
ans=0;
for(i=0;i<=s.length();i++)
{
if(s[i]!=' '&& i!=s.length()) str+=s[i];
else
{
ans+=Insert(str);
str="";
}
}
printf("%d\n",ans);
}
return 0;
}
本文探讨了Trie树在单词查找与存储方面的优化方法,通过实例解析如何正确处理重复字符,确保每个单词的唯一性,并实现高效检索。通过代码实现展示了插入与查找过程,强调了尾部标记的重要性。
878

被折叠的 条评论
为什么被折叠?



