您的位置:首页 > 其它

HDU 2072 单词数

2016-01-24 21:12 281 查看
字典树。

这题真的有点坑。

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: