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;
}