比赛 普及组2016模拟练习4 评测结果 WWWWWWWWWW
题目名称 查字典 最终得分 0
用户昵称 cdcq 运行时间 0.073 s
代码语言 C++ 内存使用 10.41 MiB
提交时间 2016-11-17 20:26:44
显示代码纯文本
//3_108_120_116
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int read(){int z=0,mark=1;  char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')mark=-1;  ch=getchar();}
	while(ch>='0'&&ch<='9'){z=(z<<3)+(z<<1)+ch-'0';  ch=getchar();}
	return z*mark;
}
int n,m;
char s[11000][110];  int l[11000];
int a[11000];
int tong[210][11000],top[210];
int rank[11000];
char _s[110];  int _l=0;
bool check(int x){
    x=rank[x];
    int __l=max(_l,l[x]);
    for(int i=1;i<=__l;i++)
        if(s[x][i] > _s[i])  return false;
    return true;
}
int fen(){
    int fleft=1,fright=n,mid;
    while(fleft+1<fright){
        mid=(fleft+fright)>>1;
        if(check(mid))  fleft=mid;
        else  fright=mid;
    }
    return check(fright) ? fright : fleft;
}
int main(){
    //freopen("ddd.in","r",stdin);
    freopen("scanword.in","r",stdin);
    freopen("scanword.out","w",stdout);
    cin>>n;
    int _max_l=0;
    for(int i=1;i<=n;i++){
        scanf("%s",s[i]+1);
        l[i]=strlen(s[i]+1);
        a[i]=read();
        _max_l=max(_max_l,l[i]);
        rank[i]=i;
    }
    for(int i=_max_l;i>=1;i--){
        memset(top,0,sizeof(top));
        for(int j=1;j<=n;j++)  tong[s[rank[j]][i]][++top[s[rank[j]][i]]]=rank[j];
        int _top=0;
        for(int j=0;j<=210;j++)for(int k=1;k<=top[j];k++){
            rank[++_top]=tong[j][k];
            tong[j][k]=0;
        }
    }
    cin>>m;
    while(m --> 0){//趋向于
        scanf("%s",_s+1);  _l=strlen(_s+1);
        printf("%d\n",a[rank[fen()]]);
    }
    return 0;
}