您的位置:首页 > 其它

HDU 1251 统计难题(字典数)

2016-07-30 14:14 465 查看
一个很典型的字典数题,不需要什么技巧模板就可以过,但是我在做这道题时出现一个状况,可以说也是学到了吧O(∩_∩)O

因为我是在linux下写的这道题,在字符串输入时一直选择了gets()函数,但是linux下的gcc好像不支持这个函数,上网搜了几个解决办法:

1 下载一个readliine-dev包

2 自己写一个readline.h的头文件

3 改用fgets函数,fgets函数跟gets函数比较相似但是还是有不同的,输入格式是这样的:

来说一说fgets(..)函数。
原型 char * fgets(char * s, int n,FILE *stream);
参数:
s: 字符型指针,指向存储读入数据的缓冲区的地址。
n: 从流中读入n-1个字符
stream : 指向读取的流。
返回值:
1. 当n<=0 时返回NULL,即空指针。
2. 当n=1 时,返回空串"".
3. 如果读入成功,则返回缓冲区的地址。
4. 如果读入错误或遇到文件结尾(EOF),则返回NULL.

这一部分摘自c语言文件操作之fgets函数

以下是代码(代码选用的是之后用fgets函数解决的):

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

struct node
{
int count;
node *next[26];
node()
{
memset(next,NULL,sizeof(next));
count=0;
}
}root;

void Buildtree(char *str)
{
int len=strlen(str);
node *p=&root,*q;

for(int i=0;i<len;++i)
{
int id=str[i]-'a';
if(p->next[id]==NULL)
p->next[id]=new node();
p=p->next[id];
p->count++;
}
}

int search(char *str)
{
int len=strlen(str);
int id;
node *p=&root;

for(int i=0;i<len;++i)
{
id=str[i]-'a';
if(p->next[id]==NULL) return 0;
p=p->next[id];
}
return p->count;
}
int main()
{
char s[20];

while(fgets(s,20,stdin)&&s[0]!='\n')
{
int len=strlen(s);
s[len-1]='\0';
Buildtree(s);
}

while(fgets(s,20,stdin))
{
int len=strlen(s);
s[len-1]='\0';
int ans=search(s);
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: