HDU1251统计难题map+输入

Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).

Input输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.

注意:本题只有一组测试数据,处理到文件结束.
Output对于每个提问,给出以该字符串为前缀的单词的数量.
Sample Input

banana
band
bee
absolute
acm

ba
b
band
abc

Sample Output

2
3
1
0


题意:

输入以该字符串为前缀的单词的数量。


注意输入:

scanf 以空格、换行符结束输入;

scanf()以Space、Enter、Tab结束一次输入,不会舍弃最后的回车符(即回车符会残留在缓冲区中)

gets 是读取换行符的,不过它会把换行符转换为'\0'

gets读入以任何字符开始的字符串,以换行符结束,但之后会丢弃换行符并以'\0'代替;

在数据大量的情况下,用gets读取快于scanf()10倍以上

scanf不能接受空格、制表符Tab、回车等;

而gets能够接受空格、制表符Tab和回车等。将接收输入的整个字符串直到遇到换行为止。

 1 #include<stdio.h>
 2 #include<map>
 3 #include<iostream>
 4 #include<string.h>
 5 using namespace std;
 6 typedef long long ll;
 7 const int x=131;
 8 const int N=1e6+20;
 9 ll book[N];
10 
11 map<string,ll>mp;
12 char a[15];
13 
14 int main()
15 {
16     //string a;
17     while(1)
18     {
19        // cin>>a;
20        gets(a);
21 //        if(a[0]=='\0')    
22 //            break;
23         int len=strlen(a);
24         if(len==0)
25             break;
26         string s;
27         s.clear();
28         for(int i=0;i<len;i++)
29         {
30            // sum=sum*x+a[i];
31             s+=a[i];
32             mp[s]++;
33         }
34     }
35 
36     while(cin>>a)
37         cout<<mp[a]<<endl;
38     return 0;
39 }
原文地址:https://www.cnblogs.com/OFSHK/p/11867151.html