字典树模板套用,求不同单词数的个数。
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <math.h>
#include <algorithm>
using namespace std;
const int MAX=26;
typedef struct TrieNode
{
int flag;
struct TrieNode *next[MAX]; //该节点的后续节点
} TrieNode;
TrieNode Memory[1000000];
int allocp = 0;
char s[50000];
int sum=0;
TrieNode * createTrieNode()
{
TrieNode * tmp = &Memory[allocp++];
tmp->flag = 1;
for (int i = 0; i < MAX; i++)
tmp->next[i] = NULL;
return tmp;
}
void insertTrie(TrieNode * pRoot, char * str)
{
TrieNode * tmp = pRoot;
int i = 0, k;
//一个一个的插入字符
int sign=1;
while (str[i])
{
k = str[i] - 'a'; //当前字符 应该插入的位置
if (tmp->next[k])
{
if(str[i+1]=='\0'&&tmp->next[k]->flag==1)
sum++;
}
else
{
if(sign)
{
sum++;
sign=0;
}
tmp->next[k] = createTrieNode();
}
tmp = tmp->next[k];
i++; //移到下一个字符
}
tmp->flag=0;
}
int main(void)
{
char temp[1000];
int i;
int length;
int j;
while(gets(s))
{
if(s[0]=='#')
return 0;
sum=0;
length=strlen(s);
allocp=0;
TrieNode *Root = createTrieNode();
i=0;
while(i<length)
{
j=0;
while(s[i]!=' '&&i<length)
{
temp[j++]=s[i++];
}
while(s[i]==' '&&i<length)
{
i++;
}
temp[j]='\0';
//printf("%s\n",temp);
insertTrie(Root,temp);
}
printf("%d\n",sum);
}
return 0;
}