• 查单词


    题目背景

    滚粗了的HansBug在收拾旧英语书,然而他发现了什么奇妙的东西。

    题目描述

    #udp2.T3如果遇到相同的字符串,输出后面的

    蒟蒻HansBug在一本英语书里面找到了一个单词表,包含N个单词(每个单词内包含大小写字母)。现在他想要找出某一段连续的单词内字典序最大的单词。

    输入格式

    第一行包含两个正整数N、M,分别表示单词个数和询问个数。

    接下来N行每行包含一个字符串,仅包含大小写字母,长度不超过15,表示一个单词。

    再接下来M行每行包含两个整数x、y,表示求从第x到第y个单词中字典序最大的单词。

    输出格式

    输出包含M行,每行为一个字符串,分别依次对应前面M个询问的结果。

    输入输出样例

    输入 #1
    5 5
    absi
    hansbug
    lzn
    kkk
    yyy
    1 5
    1 1
    1 2
    2 3
    4 4
    输出 #1
    yyy
    absi
    hansbug
    lzn
    kkk
    

    说明/提示

    样例说明:

    第一次操作:在{absi,hansbug,lzn,kkk,yyy}中找出字典序最大的,故为yyy

    第二次操作:在{absi}中找出字典序最大的,故为absi

    第三次操作:在{absi,hansbug}中找出字典序最大的,故为hansbug

    第四次操作:在{hansbug,lzn}中找出字典序最大的,故为lzn

    第五次操作:在{kkk}中找出字典序最大的,故为kkk

    数据规模:

    注意事项:1.该题目单词字典序比对过程中大小写不敏感,但是输出必须输出原单词

    2.该题目时间限制为0.2s

    #pragma GCC optimize(2)
    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstring>
    #include <bits/stdc++.h>
    
    using namespace std;
    typedef long long ll;
    typedef pair<int, int> pii;
    const int maxn = 6e4+8;
    const int M = 23;
    int n,m;
    string s;
    string st[maxn][36];
    inline string solve(string p,string q){
        string p_init=p,q_init=q;
        for(register int i=0;i<p.size();++i){
            if(p[i]>='a'&&p[i]<='z'){
                p[i]-=32;
            }
        }
        for(register int i=0;i<q.size();++i){
            if(q[i]>='a'&&q[i]<='z'){
                q[i]-=32;
            }
        }
        //cout<<p<<' '<<q<<endl;
        if(p>q)return p_init;
        else return q_init;
    }
    inline string query(int l,int r){
        int cur=log2(r-l+1);
        return solve(st[l][cur],st[r-(1<<cur)+1][cur]);
    }
    int main() {
        //freopen("1.txt", "r", stdin);
        scanf("%d%d",&n,&m);
        for(register int i=1;i<=n;++i){
            cin>>s;
    
            st[i][0]=s;
            //cout<<s<<endl;
        }
    
        for(register int j=1;(1<<j)<=n;++j){
            for(register int i=1;i+(1<<(j-1))<=n;++i){
                st[i][j]=solve(st[i][j-1],st[i+(1<<(j-1))][j-1]);
            }
        }
        //printf("***
    ");
        int l,r;
        while(m--){
            scanf("%d%d",&l,&r);
            printf("%s
    ",query(l,r).c_str());
        }
        return 0;
    }
  • 相关阅读:
    痞子衡嵌入式:MCUXpresso IDE下SDK工程在Build配置上与IAR,MDK差异
    13万字详细分析JDK中Stream的实现原理
    扫码登录是这样登录的
    [Vue深入组件-边界情况处理] 控制更新
    [Vue深入组件-边界情况处理] 模板定义的替代品
    [Vue深入组件]:递归组件和组件的循环引用
    #antdv 清除指定字段验证 #antdv表单验证指定清除
    [Vue深入组件-边界情况处理] 程序化的事件监听器
    [Vue深入组件-边界情况处理] 访问元素 & 组件
    [Vue深入组件]:Slot插槽
  • 原文地址:https://www.cnblogs.com/czy-power/p/11416228.html
Copyright © 2020-2023  润新知