Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
Input 输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.
注意:本题只有一组测试数据,处理到文件结束.
Output 对于每个提问,给出以该字符串为前缀的单词的数量.
Sample Input
banana band bee absolute acm ba b band abcSample Output
2 3 1 0
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<algorithm> #include<iostream> #include<vector> #include<stack> #include<queue> #include<map> #include<set> #define inf 0x3f3f3f3f using namespace std; typedef long long LL; const int N=1e6+1; const int mod=1e9+7; const double pi=acos(-1); const double eps=1e-8; char s[12]; int trie[N][26],sum[N],tot,root; void sert() { root=0; for(int i=0;s[i]!='\0';i++) { int id=s[i]-'a'; if(!trie[root][id]) trie[root][id]=++tot; sum[trie[root][id]]++; root=trie[root][id]; } } int finf() { root=0; int id; for(int i=0;s[i]!='\0';i++) { id=s[i]-'a'; if(!trie[root][id]) return 0; root=trie[root][id]; } return sum[root]; } int main() { while(gets(s)) { if(s[0]=='\0') break; sert(); } while(gets(s)) { printf("%d\n",finf()); } }不过这道题map也能过
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<algorithm> #include<iostream> #include<vector> #include<stack> #include<queue> #include<map> #include<set> #define inf 0x3f3f3f3f using namespace std; typedef long long LL; const int N=1e5+1; const int mod=1e9+7; const double pi=acos(-1); const double eps=1e-8; map<string,int>mapp; char s[12],c; int main() { string ss; while(gets(s)) { if(s[0]=='\0') break; int i=0; ss=""; while(s[i]!='\0') { ss+=s[i++]; mapp[ss]++; } } while(cin>>ss) { printf("%d\n",mapp[ss]); } }还有最意想不到的就是二分啦,比赛时队友想出来的,当时还没有学字典树
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<algorithm> #include<iostream> #include<vector> #include<stack> #include<queue> #include<map> #include<set> #define inf 0x3f3f3f3f using namespace std; typedef long long LL; const int N=1e5+1; const int mod=1e9+7; const double pi=acos(-1); const double eps=1e-8; map<string,int>mapp; char c; string s[1000010],ss; int main() { int k=0; while(true) { c=getchar(); if(c!='\n') s[k]+=c; else { k++; c=getchar(); if(c=='\n') break; s[k]+=c; } } sort(s,s+k); while(cin>>ss) { int l=lower_bound(s,s+k,ss)-s; int len=ss.size()-1; ss[len]+=1; int r=lower_bound(s,s+k,ss)-s; printf("%d\n",r-l); } }