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 }