统计难题
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others)Total Submission(s): 22521 Accepted Submission(s): 9488
注意:本题只有一组测试数据,处理到文件结束.
banana band bee absolute acm ba b band abc
2 3 1 0
Ignatius.L | We have carefully selected several similar problems for you: 1247 1298 2846 2222 1305
题意:给出一个单词表,上面存有一些单词,然后下面是一些前缀字符串,分别求出前缀字符串出现的次数。
分析:典型的字典树,但是也可以用map做。
代码一(字典树):
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
char str[11];
struct node{
node *next[26];
int cnt;//表示一颗字典树到此有多少颗前缀
node(){//构造函数,创建节点时自动执行
cnt=0;
for(int i=0;i<26;i++)
{
next[i]=NULL;//将该节点的下面的26个及诶单初始化为空
}
}
};
void insert(node *p,char *str)
{
for(int i=0;str[i];i++)
{
int t=str[i]-'a';
if(p->next[t]==NULL)
p->next[t]=new node; //如果节点不存在,先new一个
p=p->next[t];//指针指向子孩子
p->cnt++;//计数器累加
}
}
int find(node *p,char *str)
{
for(int i=0;str[i];i++)
{
int t=str[i]-'a';
p=p->next[t];//指针指向子孩子
if (!p)
return 0;
}
return p->cnt;
}
int main()
{
node *root= new node();
while(gets(str)&&strlen(str))
{
insert(root,str);
}
while(gets(str))
{
int ans=find(root,str);
printf("%d\n",ans);
}
return 0;
}
代码二(map):
#include<cstdio>
#include<cstring>
#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
map<string,int>M;
int main()
{
string x;
char a;
while(true)
{
scanf("%c",&a);
if(a=='\n') //需要注意输入格式
{
scanf("%c",&a);
x="";
}
if(a=='\n')
break;
x+=a;
M[x]+=1;
}
while(cin>>x)
{
cout<<M[x]<<endl;
}
return 0;
}