记录编号 176316 评测结果 AAAAATTTTT
题目名称 单词默写 最终得分 50
用户昵称 Gravatar一個人的雨 是否通过 未通过
代码语言 C++ 运行时间 5.004 s
提交时间 2015-08-08 16:37:14 内存使用 116.86 MiB
显示代码纯文本
#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;
}