字典树。
这题真的有点坑。
1,输出为0的情况。
2,第一个单词前面有空格
3,单词间的空格不止一个
4,最后的单词后面的空格
#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdio.h>
#include<math.h>
#include<queue>
using namespace std;
#define nn 1001000
char s[nn];
struct Trie
{
int ch[nn][26];
int val[nn];
int sz;
void init()
{
sz=1;
memset(ch[0],0,sizeof(ch[0]));
}
int idx(char c) {return c-'a';}
void insert(char *s,int v)
{
int u=0,n=strlen(s);
for(int i=0;i<n;i++)
{
int c=idx(s[i]);
if(!ch[u][c])
{
memset(ch[sz],0,sizeof(ch[sz]));
val[sz]=0;
ch[u][c]=sz++;
}
u=ch[u][c];
}
val[u]=v;
}
int find(char *s)
{
int u,n=strlen(s);
for(int i=0;i<n;i++)
{
int c=idx(s[i]);
if(!ch[u][c]) return 0;
u=ch[u][c];
}
return val[u];
}
}t;
int main()
{
char str[100];
while(gets(s) && s[0]!='#')
{
int j=0,ans=0;
t.init();
int n=strlen(s);
for(int i=0;i<n;)
{
while(s[i]==' ') i++;
int j=0;
while(s[i]!=' '&& i<n)
{
str[j++]=s[i++];
}
while(s[i]==' ') i++;
str[j]='\0';
if(strlen(str)==0) break;
if(!t.find(str)) { t.insert(str,1); ans++; }
}
printf("%d\n",ans);
}
return 0;
}