标签:模板
单词默写
★☆ 输入文件:engzam.in 输出文件:engzam.out 简单对比
时间限制:1 s 内存限制:128 MB
【问题描述】
小D前一段日子刚刚参加了一次非常苛刻的英语考试。
考试不仅包括了听力、选择、填空等基本题型,还包括了一种特殊的单词默写题。这类题目都是按照以下形式给出的:
在本学期你所学的所有前缀是B的单词中,在课本中出现次数不少于L的有多少个。
例如小D这个学期只学过三个单词a、ab、bc,它们出现的次数分别是1、2、3;若给出询问(B = a,L = 2),那么前缀为a的单词一共有两个,是a和ab,其中频率不少于2的只有一个,是ab。
这个学期小 D学过的单词非常多,而考试给出的这类询问也非常多。这么困难的任务小D当然不可能解决,于是这个问题被交给了你。
【输入文件】
输入文件第一行包含两个用空格隔开的整数N、M,分别表示小D本学期学过的单词数和考试中出现的询问数。
接下来N行,每行包含用空格隔开的一个单词A和一个整数P,描述小D本学期学过的一个单词A以及其出现的次数P。
接下来M行,每行包含用空格隔开的一个单词B和一个整数L,描述考试中给出的一个询问。
你可以假定所有单词均由小写字母组成,且长度不超过10。
【输出文件】
输出文件一共包含M行。
对于每个考试的询问输出一行一个整数,表示该问题的答案。
【样例输入】
3 3
a 1
ab 2
bc 3
a 2
a 1
a 3
【样例输出】
1
2
0
【样例说明】
前缀为a的单词一共有两个,是a和ab,出现次数分别为1和2。
【评分标准】
本题包含10个测试点,对于每个测试点,如果你的输出和标准输出完全一样则得到该测试点的全部分数,否则得0分。
【数据规模】
对于50%的测试数据,满足N、M ≤ 1 000
对于100%的测试数据,满足N、M ≤ 100 000,P、L ≤ 100 000
同有道搜索框那道题,很裸
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
#define idx(x) x - ‘a‘ + 1;
const int MAXN=1e6+10000;
struct Tire {
int next[28];
int val;
int flag;
}tree[MAXN];
char str[MAXN];
int nxt=1,n,m,cnt,S[100],tim=1;
void work(int,char *,int,int);
int add(){
memset(&tree[nxt],0,sizeof(Tire));
return nxt++;
}
void Insert(char *s,int x){
int rt=0,l=strlen(s);
for (int i=0;i<l;++i){
int num=idx(s[i]);
if (!tree[rt].next[num]) tree[rt].next[num]=add();
rt=tree[rt].next[num];
}
tree[rt].val+=x;
}
bool Find(char *s,int x){
int rt=0,l=strlen(s);
for (int i=0;i<l;++i){
int num=idx(s[i]);
if (!tree[rt].next[num]) return false;
rt=tree[rt].next[num];
}
work(rt,s,1,x);
return 1;
}
void work(int rt,char *s,int num,int x){
int k;
for (k=1;k<=26;++k){
S[num]=k;
if (tree[rt].val&&tree[rt].flag!=tim&&tree[rt].val>=x) {
cnt++;
tree[rt].flag=tim;
}
if (tree[rt].next[k]){
int p=tree[rt].next[k];//千万不要再用rt!!!
work(p,s,num+1,x);
}
}
}
int main(){
freopen("engzam.in","r",stdin);
freopen("engzam.out","w",stdout);
scanf("%d",&n);int x;scanf("%d",&m);
memset(&tree[0],0,sizeof(Tire));
for (int i=1;i<=n;++i){
scanf("%s %d",str,&x);
Insert(str,x);
}
for (int i=1;i<=m;++i){
scanf("%s %d",str,&x);
++tim;
cnt=0; Find(str,x);
printf("%d\n",cnt);
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:模板
原文地址:http://blog.csdn.net/qq_27138357/article/details/47396645