统计难题
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others)
Total Submission(s): 10201 Accepted Submission(s): 4156
Problem Description
Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
Input
输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.
注意:本题只有一组测试数据,处理到文件结束.
注意:本题只有一组测试数据,处理到文件结束.
Output
对于每个提问,给出以该字符串为前缀的单词的数量.
Sample Input
banana band bee absolute acm ba b band abc
Sample Output
2 3 1 0
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
const int N = 26;
typedef struct Node
{
int cnt;
Node *child[26];
}Node;
Node *root;
void init()
{//对根节点初始化,根节点不存储任何数据
root =(Node *)malloc(sizeof(Node));
for(int i = 0; i < N; i++)
root->child[i] = NULL;
root->cnt = 0;
}
void insert(char *str)
{
Node *current, *newnode;
int i, j,index;
int len = strlen(str);
if(len == 0)
return;//无须插入的情况
current = root;
for(i = 0; i < len; i++)
{
index = str[i]-'a';
if(current->child[index]!=NULL)
{//子树存在
current = current->child[index];
current->cnt++;
}
else
{//子树不存在的情况
newnode =(Node *)malloc(sizeof(Node));
for(j = 0; j < N; j++)
newnode->child[j] = NULL;
newnode->cnt = 1;
current->child[index] = newnode;//这一句不可少
current = newnode; //current = current->child[index]
}
}
}
int search( char *str )
{
int i, j, k, index;
Node *current, *newnode;
current = root;
for(i=0;str[i]!= '\0';++i )
{
index=str[i]-'a';
if(current->child[index]==NULL)
return 0;
current=current->child[index];
}
return current->cnt;
}
int main()
{
char str[15];
init();
while(gets(str),strcmp(str, ""))
insert( str );
while(gets(str)!=NULL)
printf( "%d\n", search(str));
return 0;
}
//还没找到错误
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
typedef struct Node
{
int cnt;
Node *childs[26];
Node() //不可再加上struct
{
cnt = 0;
memset(childs,NULL,sizeof(childs));
}
}Node;
Node *current, *newnode;
Node *root =(Node *)malloc(sizeof(Node));
void insert(char *str)
{
int i, j, k, index;
current=root;
for(i=0;str[i]!='\0';++i)
{
index = str[i]-'a';
if( current->childs[index]!= NULL )
{
current = current->childs[index];
++(current->cnt);
}
else
{
newnode = (Node *)malloc(sizeof(Node));
if(newnode==NULL)
exit(-1);
newnode->cnt++;//等价于 newnode->cnt=1
current->childs[index] = newnode;
current = current->childs[index];
}
}
}
int search( char *str )
{
int i, j, k, index;
current = root;
for(i=0;str[i]!= '\0';++i )
{
index=str[i]-'a';
if(current->childs[index]==NULL)
return 0;
current=current->childs[index];
}
return current->cnt;
}
int main()
{
char str[15];
while(gets(str),strcmp(str, ""))
insert( str );
while(gets(str)!=NULL)
printf( "%d\n", search(str));
return 0;
}
/*
单步调试过程中,程序产生一个访问异常(段违例)
*/