zoukankan      html  css  js  c++  java
  • 查单词

    题目背景

    滚粗了的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;
    }
  • 相关阅读:
    关于tomcat启动时报错Address already in use: JVM_Bind
    matlab学习笔记第四章——统计和MATLAB编程介绍
    matlab学习笔记第三章——绘图与图形
    matlab学习笔记第二章——矩阵
    matlab学习笔记第一章
    机器学习 什么是监督学习和无监督学习
    matlab M文件和面向对象编程
    matlab 字符串、元胞和构架数组
    使用VMware搭建3台一模一样的Linux虚拟机 搭建hadoop集群环境
    Hadoop之单机模式环境搭建
  • 原文地址:https://www.cnblogs.com/czy-power/p/11416228.html
Copyright © 2011-2022 走看看